1. Си / Говнокод #5832

    +127

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 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.

    Реализует поддержку динамического изменения частоты процессора, а приведенная функция меняет тайминги для памяти (как обычно, весьма альтернативным способом). Что характерно, это вполне себе работает на реальном железе, и вроде бы оно у меня в этом куске ни разу не падало.

    Запостил: whitequark, 01 Марта 2011

    Комментарии (22) RSS

    • и в чем вы Г узрели?
      Ответить
      • У меня язык не повернется назвать хорошим код с комментарием /* No risk, no fun: run with interrupts on! */
        Подобным шуткам не место в ядре ОС.
        Ответить
        • все правильно, комментарии не компилятся )))
          Ответить
          • Ага.

            К.О.: Код, которого нет, не компилится, все верно. Вместо этого комментария должно было быть что-то вроде local_irq_disable().
            Ответить
            • вот ВМЕСТО - это очень верно
              Ответить
            • > local_irq_disable

              А поможет? Не текущее ядро полезет к памяти, так соседнее или какая-нибудь периферия по DMA.

              З.Ы. Нафиг вообще эти джедаи к таймингам полезли? Имхо, если проц пошёл на снижение частоты, то ему уже некуда торопиться, потерпит неоптимальные задержки.
              Ответить
              • Они тайминги памяти подстраивают под частоту процессора что ли?

                Я думал, такое ушло когда пришел SDRAM

                >о, если проц пошёл на снижение частоты,
                то он тротлица лол
                Ответить
                • > SDRAM

                  А что SDRAM? Физика там внутри та же самая и не особо зависит от частоты на интерфейсе...

                  Если ты частоту скинул, то можно и тайминги (в тактах) сделать поменьше. Лишь бы в наносекундах их хватало.
                  Ответить
                  • А, так это вовсе не попытка "подстроить" частоту памяти к частоте процессора.

                    Это попытка использовать с пользой понижение частоты.
                    Нет смысла ждать 9 тактов CAS, если у тебя частота упала?

                    Это как я выбираю более низкий JDEC профайл из SPD, и получаю меньшие тайминги
                    Ответить
                    • > Нет смысла ждать 9 тактов CAS, если у тебя частота упала?

                      Ну.

                      А вообще, чуваки или очень хорошо знают свой контроллер памяти или просто слабоумные и отважные... Возможно, просто так везёт, что всё в кеше и никаких обращений к памяти нету во время смены циферок.
                      Ответить
                      • ага, а потом на продакшене они обратятся к памяти с заниженным латенси, и считают оттуда мусор.

                        Хочется конечно каких-то пруфоф, что это не премачур оптимизейшн
                        Ответить
                        • Да не, заниженной латенси вроде не должно быть, там же в комменте написано, что они тайминги наращивают до повышения частоты. А уменьшают видимо после понижения.

                          Я больше боюсь, что стейтмашина контроллера просто охуеет от смены таймингов без остановки и рестарта. Хотя может это и фича такая, фиг знает.
                          Ответить
                          • А, ты имеешь ввиду, что они понизили их при понижении частоты, и получили выше скорость, но на самом деле потому, что тупо считали данные из кеша?

                            >охуеет от смены таймингов без остановки шины.
                            у штеуда так можно, кстати?

                            Обычно эту херню ставит био firmware, и делает это вероятно ДО запуска контроллера памяти?
                            Ответить
                            • > вероятно ДО запуска контроллера памяти

                              Вероятно, по крайней мере в даташите STM'ки написано, что при смене частоты надо выключать clock и заново проходить инициализацию.

                              Может быть на более продвинутых контроллерах памяти можно и на ходу, но что-то я сомневаюсь.
                              Ответить
                              • А там есть кстати SPD? Или надо читать датащит памяти и программировать частоту вручну.?
                                Ответить
                                • > SPD

                                  Неа, там же голые SDRAM чипы обычно распаиваются, а SPD на планке стоит, а не в чипе.

                                  Так что только даташит, только хардкод.
                                  Ответить
                                  • а он умеет с несколькими чипами одновременно работать, как RANK? А дуал ченел может?

                                    Какая там шЫрина канала?
                                    Ответить
                                    • > как RANK

                                      Там 32 бита, можно в теории 2 по 16 впаять или 4 по 8.

                                      > дуал ченнел

                                      Не, только по-очереди, как если бы ты воткнул 2 планки в один канал. Это же простенький микроконтроллер а не комп, лол.
                                      Ответить
    • Где здесь говнокод? Даже комментарии оставили, зачем это нужно. Писали этот кусок явно не китайцы.
      Ответить
      • Возможно, это было временное просветление. В целом поддержка этой архитектуры реализована настолько ужасно, насколько это может быть. (200-килобайтный хидер со всеми дефайнами для чипа, например. Причем для разных вариаций, отличающихся в лучшем случае наличием пары периферических модулей, они его дублируют.)
        Ответить
    • https://github.com/batman52/dingux-code/blob/65e7bbe119f03fb179cf361f984016151cbd784c/linux-2.6.24.3-dingux/trunk/arch/mips/jz4750d/cpufreq.c#L201

      какой-то "jz4750d", и ядро какое-то древнее. Вряд ли современное ядро этот SoC поддерживает, к тому же MIPS уже всё. Надо чтоб RISC-V
      Ответить
    • Печально, сайт стал падали. Раньше он не падали, теперь - падали.
      Ответить

    Добавить комментарий