There is a way, even when your goddamn OEM provider locked out everything from your bios just in case you try fix the annoying whine problem in their laptop.
You need to write one Model Specific Register (MSR).
It can be done with several utilities (RW-Everything, CrystalCPUID or whatever you can find).
The exact MSR address and the C-State values for a plenty of Intel CPUs can be found in Intel® 64 and IA-32 Architectures Software Developer’s Manual (Volume 3B: System Programming Guide, Part 2).
I have Core i5 520M and the register for it is MSR_PKG_CST_CONFIG_CONTROL (0x00E2).
You need to specify the highest possible value in Package C-State limit field (bits 2:0) for which the whine disappears. (In my case the change was from 3 down to 1)
In case of RW-Everything you need to add the register and its address manually using the user list function of the MSR access window.
In case of CrystalCPUID you can set the value per core (Core i5 520M has 2 cores which are displayed as 4 CPUs) and basically downgrading one core is enough to stop the whine.
Unfortunately both utilities I've found doesn't give a way to make them do what's needed automatically, so you need to start them and change the value manually every time you start your PC, but at least the configuration is remembered and you can close the utilities after the change.
RW-Everything actually provide an automated method, a script can be loaded from the command line via rw.exe /command=ScriptName.rw
In my case the script is:
>WRMSR 0x00e2 0x00000000 0x02000401
CPU 3 focuses the second core of the CPU, if omitted the first core (CPU 1 and CPU 2) will be focused. If both cores must be configured separate
WRMSR commands are needed after focusing each of the cores.
Keep in mind that the value to be written is probably CPU model specific. Your default can be seen in the RW-Everything's MSR window.
The next step is to create a scheduled task which to run the application at startup and after resuming from sleep (the config is reset then).