- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
static void jz_update_dram_prev(unsigned int cur_mclk, unsigned int new_mclk)
{
/* No risk, no fun: run with interrupts on! */
if (new_mclk > cur_mclk) {
/* We're going FASTER, so first update TRAS, RCD, TPC, TRWL
* and TRC of DMCR before changing the frequency.
*/
jz_update_dram_dmcr(new_mclk);
} else {
/* We're going SLOWER: first update RTCOR value
* before changing the frequency.
*/
jz_update_dram_rtcor(new_mclk);
}
}
Кусок кода из официального™ китайского дерева исходников Линукса для одного System-on-Chip.
Реализует поддержку динамического изменения частоты процессора, а приведенная функция меняет тайминги для памяти (как обычно, весьма альтернативным способом). Что характерно, это вполне себе работает на реальном железе, и вроде бы оно у меня в этом куске ни разу не падало.
Подобным шуткам не место в ядре ОС.
К.О.: Код, которого нет, не компилится, все верно. Вместо этого комментария должно было быть что-то вроде local_irq_disable().
А поможет? Не текущее ядро полезет к памяти, так соседнее или какая-нибудь периферия по DMA.
З.Ы. Нафиг вообще эти джедаи к таймингам полезли? Имхо, если проц пошёл на снижение частоты, то ему уже некуда торопиться, потерпит неоптимальные задержки.
Я думал, такое ушло когда пришел SDRAM
>о, если проц пошёл на снижение частоты,
то он тротлица лол
А что SDRAM? Физика там внутри та же самая и не особо зависит от частоты на интерфейсе...
Если ты частоту скинул, то можно и тайминги (в тактах) сделать поменьше. Лишь бы в наносекундах их хватало.
Это попытка использовать с пользой понижение частоты.
Нет смысла ждать 9 тактов CAS, если у тебя частота упала?
Это как я выбираю более низкий JDEC профайл из SPD, и получаю меньшие тайминги
Ну.
А вообще, чуваки или очень хорошо знают свой контроллер памяти или просто слабоумные и отважные... Возможно, просто так везёт, что всё в кеше и никаких обращений к памяти нету во время смены циферок.
Хочется конечно каких-то пруфоф, что это не премачур оптимизейшн
Я больше боюсь, что стейтмашина контроллера просто охуеет от смены таймингов без остановки и рестарта. Хотя может это и фича такая, фиг знает.
>охуеет от смены таймингов без остановки шины.
у штеуда так можно, кстати?
Обычно эту херню ставит био firmware, и делает это вероятно ДО запуска контроллера памяти?
Вероятно, по крайней мере в даташите STM'ки написано, что при смене частоты надо выключать clock и заново проходить инициализацию.
Может быть на более продвинутых контроллерах памяти можно и на ходу, но что-то я сомневаюсь.
Неа, там же голые SDRAM чипы обычно распаиваются, а SPD на планке стоит, а не в чипе.
Так что только даташит, только хардкод.
Какая там шЫрина канала?
Там 32 бита, можно в теории 2 по 16 впаять или 4 по 8.
> дуал ченнел
Не, только по-очереди, как если бы ты воткнул 2 планки в один канал. Это же простенький микроконтроллер а не комп, лол.
какой-то "jz4750d", и ядро какое-то древнее. Вряд ли современное ядро этот SoC поддерживает, к тому же MIPS уже всё. Надо чтоб RISC-V