From 381a1eafc436971d9c4a95902a4a99aec4e92bc1 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 12 May 2026 10:32:14 +0200 Subject: [PATCH] ldr: properly clamp soc voltage --- .../loader/source/oc/pcv/pcv_mariko.cpp | 22 +- dist/README.md | 214 ------------------ dist/atmosphere/kips/hoc.kip | Bin 343180 -> 343244 bytes 3 files changed, 14 insertions(+), 222 deletions(-) delete mode 100644 dist/README.md diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp index 62b78156..c13c1c60 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp @@ -796,9 +796,9 @@ namespace ams::ldr::hoc::pcv::mariko { R_SKIP(); } - u32 max0 = 1050; - u32 max1 = 1025; - u32 max2 = 1000; + s32 max0 = 1050; + s32 max1 = 1025; + s32 max2 = 1000; s32 voltAdd = 25 * C.emcDvbShift; if (C.marikoSocVmax && C.marikoSocVmax > 1000) { @@ -807,11 +807,17 @@ namespace ams::ldr::hoc::pcv::mariko { max2 = C.marikoSocVmax; } - auto DvbVolt = [&](u32 zero, u32 one, u32 two) { - return std::array{ - std::min((u32)((s32)zero + voltAdd), max0), - std::min((u32)((s32)one + voltAdd), max1), - std::min((u32)((s32)two + voltAdd), max2) + constexpr s32 minVolt = 637; + + auto ClampVolt = [&](s32 value, s32 max) { + return std::clamp(value + voltAdd, minVolt, max); + }; + + auto DvbVolt = [&](s32 zero, s32 one, s32 two) { + return std::array{ + ClampVolt(zero, max0), + ClampVolt(one, max1), + ClampVolt(two, max2) }; }; diff --git a/dist/README.md b/dist/README.md deleted file mode 100644 index ff3e6be6..00000000 --- a/dist/README.md +++ /dev/null @@ -1,214 +0,0 @@ - -
- -logo - ---- - -![License: GPL-2.0](https://img.shields.io/badge/GPL--2.0-red?style=for-the-badge) -![Nintendo Switch](https://img.shields.io/badge/Nintendo_Switch-E60012?style=for-the-badge\&logo=nintendo-switch\&logoColor=white) -[![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge\&logo=discord\&logoColor=white)](https://dsc.gg/horizonoc) -![VSCode](https://img.shields.io/badge/VSCode-0078D4?style=for-the-badge\&logo=visual%20studio%20code\&logoColor=white) -![Made with Notepad++](assets/np++.png?raw=true) -![C++](https://img.shields.io/badge/C%2B%2B-00599C?style=for-the-badge\&logo=c%2B%2B\&logoColor=white) -![Downloads](https://img.shields.io/github/downloads/Horizon-OC/Horizon-OC/total.svg?style=for-the-badge) - ---- - -
- -## ⚠️ Disclaimer - -> **THIS TOOL CAN BE DANGEROUS IF MISUSED. PROCEED WITH CAUTION.** -> Due to the design of Horizon OS, **overclocking RAM can cause NAND OR SD CORRUPTION.** -> Ensure you have a **full NAND, PROINFO, EMUMMC and SD backup** before proceeding. - ---- - -## About - -**Horizon OC** is an open-source overclocking tool for Nintendo Switch consoles running **Atmosphere custom firmware**. -It enables advanced CPU, GPU, and RAM tuning with user-friendly configuration tools. - ---- - -## Default clocks - -* **CPU:** Up to 1963MHz (Mariko) / 1785MHz (Erista) -* **GPU:** Up to 1075MHz (Mariko) / 921MHz (Erista) -* **RAM:** Up to 1866/2133MHz (Mariko) / 1600MHz (Erista) -* Over/undervolting support -* Built-in configurator -* Compatible with most homebrew - -> It is recommended to read the [guide](https://rentry.co/howtoget60fps) before proceeding, as this can help you get a *significant* performance boost over the default settings, often times with less power draw and heat output - ---- - -## Installation - -1. Ensure you have the latest versions of - - * [Atmosphere](https://github.com/Atmosphere-NX/Atmosphere) - * [Ultrahand Overlay](https://github.com/ppkantorski/Ultrahand-Overlay) -2. Download and extract the **Horizon OC Package** to the root of your SD card. -3. If using **Hekate**, edit `hekate_ipl.ini` to include: - - ``` - kip1=atmosphere/kips/hoc.kip - ``` - - *(No changes needed if using fusee.)* - ---- - -## Configuration - -1. Open the Horizon OC Overlay -2. Open the settings menu -3. Adjust your overclocking settings as desired. A helpful guide can be found [here.](https://rentry.co/mariko#oc-settings-for-horizon-oc) -4. Click **Save KIP Settings** to apply your configuration. - ---- - -## Building from Source - -Refer to COMPILATION.md - ---- -## Clock table - -### MEM clocks (mhz) - -* 3200 → max on mariko, JEDEC. -* 3166 -* 3133 -* 3100 -* 3066 -* 3033 -* 3000 -* 2966 -* 2933 → JEDEC. -* 2900 -* 2866 -* 2833 -* 2800 -* 2766 -* 2733 -* 2700 -* 2666 → JEDEC. -* 2633 -* 2600 -* 2566 -* 2533 -* 2500 -* 2466 -* 2433 -* 2400 → max on erista, JEDEC. -* 2366 -* 2333 -* 2300 -* 2266 -* 2233 -* 2200 -* 2166 -* 2133 → Mariko JEDEC standard max (4266 Modules) -* 2100 -* 2066 -* 2033 -* 2000 -* 1996 → JEDEC standard -* 1966 -* 1933 -* 1900 -* 1866 → Mariko JEDEC standard max (3733 Modules) -* 1833 -* 1800 -* 1766 -* 1733 -* 1700 -* 1666 -* 1633 -* 1600 → official docked, boost mode, Erista JEDEC standard max (3200 Modules), JEDEC. -* 1331 → official handheld, JEDEC. -* 1065 -* 800 -* 665 - -### CPU clocks (mhz) -* 2703 → mariko absolute max, dangerous -* 2601 → unsafe -* 2499 -* 2397 → mariko safe max with UV (low speedo) -* 2295 -* 2193 -* 2091 -* 1963 → mariko no UV max clock -* 1887 -* 1785 → erista no UV max clock, boost mode -* 1683 -* 1581 -* 1428 -* 1326 -* 1224 → sdev oc -* 1122 -* 1020 → official docked & handheld -* 918 -* 816 -* 714 -* 612 → sleep mode - -### GPU clocks (mhz) -* 1536 → absolute max clock on mariko. very dangerous -* 1459 -* 1382 -* 1305 -* 1267 → NVIDIA T214(mariko) rating -* 1228 → mariko High UV safe clock -* 1152 → mariko hiOpt-15mV max clock -* 1075 → mariko hiOpt max clock. absolute max clock on erista. very dangerous -* 998 → NVIDIA T210 (erista) rating -* 960 (erista only) → erista high uv/hiOpt-15mV safe max clock -* 921 → erista no UV max clock -* 844 -* 768 → official docked -* 691 -* 614 -* 537 -* 460 → max handheld -* 384 → official handheld -* 307 → official handheld -* 230 -* 153 -* 76 → boost mode - -**Notes:** -1. On Erista, CPU in handheld is capped to 1581MHz -2. GPU overclock is capped at 460MHz on erista in handheld -3. On Mariko, cap with hiOpt is 614MHz, with hiOpt-15mV it is 691MHz and with High UV it's 768MHz -4. Clocks higher than 768MHz on erista need the official charger is plugged in. - ---- - -## Credits -* **Lightos's Cat** - Cat -* **Souldbminer** - hoc-clk and loader development -* **Lightos** - Loader patches development, hoc-clk development, guides -* **TDRR** - HOC Logo Design -* **tetetete-ctrl** - Website design -* **SciresM** - Atmosphere CFW -* **CTCaer** - L4T, Hekate, proper RAM timings -* **KazushiMe** - Switch OC Suite -* **Hanai3bi (Meha)** - Switch OC Suite, EOS, sys-clk-eos -* **NaGaa95** - L4T-OC kernel, Status Monitor fork -* **B3711 (halop)** - EOS, contributions -* **sys-clk team (m4xw, p-sam, natinusala)** - sys-clk -* **Dominatorul** - Soctherm driver, guides, general help -* **ppkantorski** - Ultrahand sys-clk & Status Monitor fork -* **MasaGratoR and ZachyCatGames** - General help -* **MasaGratoR** - Status Monitor & Display Refresh Rate driver -* **Dominatorul, Samybigio, Arcdelta, Miki, Happy, Winnerboi77, Blaise, Alvise, agjeococh, frost, letum00, and Xenshen** - Testing -* **Samybigio2011, Miki** - Italian translations -* **angelblaster** - Korean translations -* **q1332348216-glitch** - Chinese translations -* **Nvidia** - [Tegra X1 Technical Reference Manual](https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual), soctherm driver, L4T diff --git a/dist/atmosphere/kips/hoc.kip b/dist/atmosphere/kips/hoc.kip index b14d598a5031d5778a5b687b4c6038322426e2cd..3c84a5539bab8113c8431f59e55ccced446bd11d 100644 GIT binary patch delta 16926 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 delta 16853 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