diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp
index e874d374093d8d27f600980a986414df4a2f52b8..01c0cd19b4780da45360345cd2cd6f602e85b49f 100644
--- a/Marlin/src/gcode/bedlevel/abl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp
@@ -391,18 +391,21 @@ G29_TYPE GcodeSuite::G29() {
 
       xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_SPEED));
 
+      const float x_min = probe_min_x(), x_max = probe_max_x(),
+                  y_min = probe_min_y(), y_max = probe_max_y();
+
       if (parser.seen('H')) {
         const int16_t size = (int16_t)parser.value_linear_units();
-        left_probe_bed_position  = _MAX(X_CENTER - size / 2, probe_min_x());
-        right_probe_bed_position = _MIN(left_probe_bed_position + size, probe_max_x());
-        front_probe_bed_position = _MAX(Y_CENTER - size / 2, probe_min_y());
-        back_probe_bed_position  = _MIN(front_probe_bed_position + size, probe_max_y());
+        left_probe_bed_position  = _MAX(X_CENTER - size / 2, x_min);
+        right_probe_bed_position = _MIN(left_probe_bed_position + size, x_max);
+        front_probe_bed_position = _MAX(Y_CENTER - size / 2, y_min);
+        back_probe_bed_position  = _MIN(front_probe_bed_position + size, y_max);
       }
       else {
-        left_probe_bed_position  = parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MAX(X_CENTER - X_BED_SIZE / 2, probe_min_x());
-        right_probe_bed_position = parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MIN(left_probe_bed_position + X_BED_SIZE, probe_max_x());
-        front_probe_bed_position = parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MAX(Y_CENTER - Y_BED_SIZE / 2, probe_min_y());
-        back_probe_bed_position  = parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MIN(front_probe_bed_position + Y_BED_SIZE, probe_max_y());
+        left_probe_bed_position  = parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MAX(X_CENTER - X_BED_SIZE / 2, x_min);
+        right_probe_bed_position = parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MIN(left_probe_bed_position + X_BED_SIZE, x_max);
+        front_probe_bed_position = parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MAX(Y_CENTER - Y_BED_SIZE / 2, y_min);
+        back_probe_bed_position  = parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MIN(front_probe_bed_position + Y_BED_SIZE, y_max);
       }
 
       if (
diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp
index 1e78a49b45498e46fcfa3b1a050057bb3fbafcda..514bb6589153afa89fd00c5370dfbe4cefaaebdb 100644
--- a/Marlin/src/gcode/calibrate/G28.cpp
+++ b/Marlin/src/gcode/calibrate/G28.cpp
@@ -39,9 +39,7 @@
   #include "../../feature/tmc_util.h"
 #endif
 
-#if HOMING_Z_WITH_PROBE || ENABLED(BLTOUCH)
-  #include "../../module/probe.h"
-#endif
+#include "../../module/probe.h"
 
 #if ENABLED(BLTOUCH)
   #include "../../feature/bltouch.h"
diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp
index 37422bdb157197adb5ee5c410aaa3c2eb4830508..777c1c9ea1310e6ba9c8596a05179a09b39b9dd9 100644
--- a/Marlin/src/module/probe.cpp
+++ b/Marlin/src/module/probe.cpp
@@ -28,9 +28,9 @@
 
 #if HAS_BED_PROBE
 
-#include "../libs/buzzer.h"
-
 #include "probe.h"
+
+#include "../libs/buzzer.h"
 #include "motion.h"
 #include "temperature.h"
 #include "endstops.h"
@@ -86,43 +86,6 @@ float probe_offset[XYZ]; // Initialized by settings.load()
 #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
 #include "../core/debug_out.h"
 
-float probe_min_x() {
-  return _MAX(
-    #if ENABLED(DELTA) || IS_SCARA
-      PROBE_X_MIN, MESH_MIN_X
-    #else
-      (X_MIN_BED) + (MIN_PROBE_EDGE), (X_MIN_POS) + probe_offset[X_AXIS]
-    #endif
-  );
-}
-float probe_max_x() {
-  return _MIN(
-    #if ENABLED(DELTA) || IS_SCARA
-      PROBE_X_MAX, MESH_MAX_X
-    #else
-      (X_MAX_BED) - (MIN_PROBE_EDGE), (X_MAX_POS) + probe_offset[X_AXIS]
-    #endif
-  );
-}
-float probe_min_y() {
-  return _MAX(
-    #if ENABLED(DELTA) || IS_SCARA
-      PROBE_Y_MIN, MESH_MIN_Y
-    #else
-      (Y_MIN_BED) + (MIN_PROBE_EDGE), (Y_MIN_POS) + probe_offset[Y_AXIS]
-    #endif
-  );
-}
-float probe_max_y() {
-  return _MIN(
-    #if ENABLED(DELTA) || IS_SCARA
-      PROBE_Y_MAX, MESH_MAX_Y
-    #else
-      (Y_MAX_BED) - (MIN_PROBE_EDGE), (Y_MAX_POS) + probe_offset[Y_AXIS]
-    #endif
-  );
-}
-
 #if ENABLED(Z_PROBE_SLED)
 
   #ifndef SLED_DOCKING_OFFSET
diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h
index b6f70ca857d3e2d16e9e91bbdbc0dca6538722cc..b9c44f1da92797e38481a601371f341beafdcaaf 100644
--- a/Marlin/src/module/probe.h
+++ b/Marlin/src/module/probe.h
@@ -47,7 +47,42 @@
     extern const char msg_wait_for_bed_heating[25];
   #endif
 
-  float probe_min_x(), probe_max_x(), probe_min_y(), probe_max_y();
+  inline float probe_min_x() {
+    return _MAX(
+      #if ENABLED(DELTA) || IS_SCARA
+        PROBE_X_MIN, MESH_MIN_X
+      #else
+        (X_MIN_BED) + (MIN_PROBE_EDGE), (X_MIN_POS) + probe_offset[X_AXIS]
+      #endif
+    );
+  }
+  inline float probe_max_x() {
+    return _MIN(
+      #if ENABLED(DELTA) || IS_SCARA
+        PROBE_X_MAX, MESH_MAX_X
+      #else
+        (X_MAX_BED) - (MIN_PROBE_EDGE), (X_MAX_POS) + probe_offset[X_AXIS]
+      #endif
+    );
+  }
+  inline float probe_min_y() {
+    return _MAX(
+      #if ENABLED(DELTA) || IS_SCARA
+        PROBE_Y_MIN, MESH_MIN_Y
+      #else
+        (Y_MIN_BED) + (MIN_PROBE_EDGE), (Y_MIN_POS) + probe_offset[Y_AXIS]
+      #endif
+    );
+  }
+  inline float probe_max_y() {
+    return _MIN(
+      #if ENABLED(DELTA) || IS_SCARA
+        PROBE_Y_MAX, MESH_MAX_Y
+      #else
+        (Y_MAX_BED) - (MIN_PROBE_EDGE), (Y_MAX_POS) + probe_offset[Y_AXIS]
+      #endif
+    );
+  }
 
 #else
 
@@ -55,6 +90,11 @@
   #define DEPLOY_PROBE()
   #define STOW_PROBE()
 
+  inline float probe_min_x() { return 0; };
+  inline float probe_max_x() { return 0; };
+  inline float probe_min_y() { return 0; };
+  inline float probe_max_y() { return 0; };
+
 #endif
 
 #if HAS_Z_SERVO_PROBE