<think>
Okay, I need to implement the split_length function according to the given specifications. Let me start by understanding the problem.

The function takes an integer mm (millimeters) and converts it into a string in workshop notation. The notation is meters first, then centimeters, then millimeters. Each unit is represented by its count followed by the symbol. The steps are: first carve off whole meters (since 1m is 1000mm), then whole centimeters (1cm is 10mm), and the leftover is millimeters. If any of these counts are non-zero, they are included in the output. If all are zero, it's "0mm". Also, the input must be a valid integer; otherwise, it's rejected. Negative values or non-integer inputs should raise an error.

First, I need to validate the input. The function should check if mm is a non-negative integer. If it's negative, raise ValueError. Also, if mm is not an integer (but according to the contract, the input is an int, so maybe the function is supposed to handle only integers, but the problem says to reject non-integer inputs. Wait, the problem says: "Reject a length that is not a whole number — a fraction, a string, or a boolean — and a negative length, with an error." So the function's parameter is an int, but the code must check that the input is a valid integer. Wait, but the function is supposed to take an int. Wait, the function's signature is def split_length(mm: int) -> str. So the input is an integer. But the problem says that if the input is not a whole number (like a float, string, boolean), it should be rejected. But since the function's parameter is an int, maybe the code is supposed to check that the input is a valid integer. Wait, but in Python, the function is called with an integer. However, the problem says that if the input is not a whole number (like a float, string, boolean), it should be rejected. But the function's parameter is an int. So perhaps the code should check that the input is an integer. Wait, but the function is supposed to take an int. So maybe the code is supposed to check that the input is a valid integer. Wait, but in Python, if someone passes a float, like 123.4, it would be invalid. But the function's parameter is defined as int. So perhaps the code should check that the input is an integer. But how? Because in Python, if you pass a float, it would be allowed, but according to the problem, it's invalid. So the function needs to check that the input is an integer. Wait, but the function's parameter is defined as int. So maybe the code should check that the input is an integer. But how? Because in Python, if you pass a float, like 123.0, it would be considered as an integer in the function. But according to the problem, that's invalid. So the function needs to check that the input is an integer. So, for example, if mm is 123.5, it's invalid. But the function's parameter is int, so how can that happen? Maybe the code should check that the input is an integer. Wait, but the function is supposed to take an int. So perhaps the code should check that the input is a non-negative integer. So, the first step is to validate that mm is a non-negative integer. If it's negative, raise ValueError. Also, if mm is not an integer (but how? Because the function is supposed to take an int. Maybe the