In an ideal world 'promotions' should be a) a completely separate discussion from pay rises (as in a promotion is not automatically connected with getting a pay rise and ideally you should have to prove yourself in your new position before you even get to discuss pay) and b) not based on how good you are at your current job, but how good someone thinks you might be at the job you're promoted into.
I've seen several cases where the best engineers get promoted into positions of greater responsibility simply because they're the best engineers and completely floundering in the new role because it's largely unrelated to what they're actually good at. On the same note I've also seen fairly mediocre engineers get promoted and excelling in their new role since the new role fit them a lot better.
If you're great software engineer you should be able to spend 20 years at a company as software engineer with the job title software engineer and still get regular pay rises and end up earning the same or more as the senior managers.