Страшные сказки на ночь, о PCI шине

Всеобщая эйфория от появления на рынке новых процессоров, не дает достаточно времени кинуть взгляд, а что же там у них «под капотом». Те же их стороны, которыми обычно восхищаются кликатели и кнопкодавы, вовсе не отражают реальное положение дел на железном фронте.

А тучи, тем временем, сгущались. Да, процессоры стали быстрее. Да, действительно, там стало больше ядер. И последнее, как раз, является серьезной архитектурной проблемой. По крайней мере, для наметившегося лидера гонки.

Кто сейчас помнит такой архаизм как «Архитектура»? Мало кто. Слово в станкостроении стало в IT практически ругательным. А ведь когда-то, в былые времена, книга «PCI System Architecture „ и прочие, зачитывалась до дыр, на экране. И что же там такого страшного, в этом осколке прошлого, накарябано о PCI, что может нас ввести в глубокую задумчивость, полную вселенской грусти?

Страшная цифра — 256. Хотя, на первый взгляд, и не очень страшная. Да, именно столько, и есть максимальный предел присутствия независимых PCI устройств, на PCI шине. Цифра кажется на самом деле заоблачной.

Ну кому, в здравом уме и твердой памяти, придет в голову иметь в компьютере больше 5-10 реальных, т.е. “физических» устройств? Именно исходя из этих «логичных» предпосылок, недавний лидер процессорной гонки, вводил ограничивающие настройки в свой чипсет, дающие возможность принудительно ограничивать волшебную цифру до 128, 64, и не поверите 32(!) PCI шин. И это была не просто блажь, т.к. давало серьезную возможность экономить системный кусок (первые 4Gb) памяти, до сих пор наделенный "волшебными свойствами" в отношении ОС. В том то и дело, что физических устройств было до недавнего времени не очень много.
Но, время не стоит на месте, и вот я держу в руках очередное 64 ядерное чудо враждебной техники, Rome от AMD.

И что же он хочет, нет ТРЕБУЕТ, для своего минимального функционирования? Всего то малость… откусить для своих 64 ядер… пространство в 80 PCI шин. Браво. Но, ведь у нас есть еще 2/3 пространства? У кого то есть, а у кого-то и нет.

Первый раз на небездонность PCI шины я обратил внимание, настраивая PCI расширитель, так уж получилось, что на нем висело, за гроздью из P2P мостов Pericom, 119 PCI устройств требовавших подобное же количество индивидуальных PCI шин. И это только за единственным х8 PCI расширителем. А таких х8 портов, там было 8. Вот тут, как бы невзначай, и всплывает "волшебность" первых 4Gb системной памяти, когда львиная доля из тех 119 PCI устройств, требует для своей инициализации во время обнаружения БИОСом «скромные» 32-64 Мб на каждого.

Хорошо что Интел не так мощно выгрызет PCI пространство. При необходимости, но повесить второю гроздь еще оставалось возможным.

А вот с Rome и единственное такое «расширение» лишает нас надежды хоть на какое то будущее столь увесистой «грозди», в этой АМД системе. Нет, конечно, клиенту можно предложить перейти на суперкомпьютерную архитектуру, ту которая будет под заказ, и выльется в 10 раз дороже. Но и вышепредложенная конфигурация, как вы успели заметить, не для каждого из нас. И также разрабатывается индивидуально под хотелки клиента. Но архитектурная граница хотелок уже ощутимо близка. Не хочется в каждую вышку мобильной связи лепить суперкомпьютер, исключительно из-за тридцатилетней «ограниченности» PCI шины. Что самое интересное, но переход на ARM совершенно не выход, поскольку на нем мы видим все тот же PCI, и все те же 30 летние ограничения.

Увы, ситуация в деталях повторяет тенденцию с памятью, стало мало? Пихай-суй больше! PCI пространство есть? Что его жалеть, от него не убудет. Увы, уже убудет. Уже, не то что в четверо или вдвое не обрежешь, чем баловался Интел. Уже и в полном объеме, для серьезных игроков — на грани. И применение транспарентных P2P мостов, увы только паллиатив, в сложившейся ситуации.

Только и остается что беречь каждый байт адрес шины. Или мечтать о том что крупные игроки созреют для создания IP6 адресов SuperPCIExpress.

UPD
Уважаемый ikle, поделился ценной информацией по поднятой теме в своем комментарии

Дак в PCI всё для этого уже есть — буковка S в SBDF — целых 16 бит — четвёртое измерение. Более того, PCI-E позволяет уже использовать разные сегменты: Если ОС не дремучая и умеет понимать ACPI MCFG таблицу, то проблемы никакой нет уже сейчас.

Описываемая в статье проблема — это проблема реализации платформы: никто не мешает прямо сейчас завести на платформе несколько сегментов, подправить BIOS, чтобы он отдавал в ACPI MCFG, где искать базовый каждого адрес сегмента и всё


А от себя добавлю, что в UefiShell есть коменда pci c параметром -s Seg которая как раз и показывет нужный PCI сегмент. Печаль только в том, что новые сегменты растут исключительно(я так пока понял) из дополнительных физических процессоров. А с этим мало кто встречается. Многоядерность — «это не совсем то». Либо, как вариант, P2P мост должен поддерживать эту достаточно не популярную в широких массах опцию.

UPD2
Всем, сигнализировавшим от ошибках в тексте, большое спасибо. Исправил, как только смог.
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 58

    +2
    Так и представляю себе майнинг ферму с навешанными через сотню расширителей гроздью видеокарт :)
      +3

      Помоему, там что то другое. Не зря же провайдеры сотовой упомянут. Но да. Хотелось бы хотя бы фото, чего ж там такого можно навещать.

        +3

        На самом деле, конечно, клиент никогда не делится чем конкретно будет заниматься та или иная система. Но иногда проскакивает при личном общении, что-то идёт на сотовые вышки, что-то на тестирование мобильников на их производстве, когда надо тестировать сотнями тысяч.

        +3

        Какая сотня?
        Майнинг-риги максимум на 12 карт.
        Есть и 19 — это уже ближе к крэйзи.
        Тупо не имеет смысла, гемора больше, чем профита.

          0
          Так а что не выдерживает? Что будет, если больше навесить?
            +3
            Блоки питания не выдерживают. 1 ферма — 1 блок питания. Даже есть взять блок на 2000 Ват, то на него можно повесить лишь ограниченное количество видеокарт.

            Есть фермы с 2-мя блоками питания, но это редкость, т.е. есть сложность в подключении, синхронизации их старта и т.д.

            Большинство ферм собирается из «потребительских» компьютерных комплектующих, а поэтому там нет резерва по питанию, функций горячей замены и т.д. Чтобы заменить 1 видеокарту необходимо выключать всю ферму.

              0
              В продаже масса каскадируемых промышленных БП с сотовых БС. Там и мегаватты при желании насобирать можно. Стоят гроши.
                0

                А можно пару примеров, пожалуйста?

                  +3
                  Например вот и вот. Производителей и моделей много. БП конфигурируемые, программно настраиваются под нужное напряжение.

                  Подобные БП предназначены для плотного монтажа, у них высокий КПД и схемотехника, выгодно отличающаяся от применяемой в среднем БП АТХ.
                  Также они легко каскадируются и синхронизируются.
                    0

                    Так обе ссылки про 48 вольт. Да, там можно настроить вольтаж, но, как я понял, в небольших пределах. То есть, 43 вольта, может, и можно. Но вот 12 уже никак.
                    А ЕМНИП, на устройствах типа видеокарт что-то вроде 12 или 5 надо. Или можно выход одного на вход другого? Но тогда разве "нижний" включится? В характеристикам на али написано автовольтаж 89-265 или что-то вроде того. 48 на вход, значит, просто не включит его.
                    Или я чего-то не понимаю?)

                      0
                      Это одно устройство, русскоязычный обзор и источник.
                      Возможно, есть и двенадцативольтовые БП, не подумал про применение именно для майнинга. 48 В видимо заряжали батареи, соединённые последовательно по четыре, для уменьшения тока. 48 В отдать 12 уломать наверно можно, но с потерей в КПД.
                      Можно посмотреть зарядки для авто, встречал 2-3-4-канальные до 300 А.
                0
                Синхронность нужна в рамках 1 секунды, а это обеспечивает даже чёртово реле. Не вижу вообще никаких трудностей в организации фермы хоть из 200 видеокарт, лишь бы адресного пространства и пропускной способности хватило.

                П.С. При отладке работы шины с кучей девайсов (у меня всего 40 было), через китайские райзеры «1 слот в 4 слота» делал гирлянду и питал вообще от всего, что попало (включая лабораторный БП и БП для сварочника, благо тот выдавал 12 вольт.)
              0
              Риг с 15ю картами амд доставляет проблем ни чуть не больше, чем с 12ю. 16 карт, кстати, не поддерживается драйверами — падает опенцл либа при обращении к ней. Мать обычная, 4 сплиттера, правленный биос.
            +1
            Если от устройств не требуется высокой производительности и они могут работать по опросу, то можно ставить на одни и те же адреса.
            Я так делал.
            PCI config table по разным адресам так-то но таблица по 256 байт всего.
            В таблицу можно писать байт disable во все карты и enable в одну. После этого с этой картой работаете. Потом выключаете i/o через PCI config table на этой карте включаете другую и пишите и читаете из/в нее. Но это только для pci target естественно.
            В этом случае базовые адреса для i/o могут быть одинаковые.
              +1

              》не требует высокой производительности
              Это из области фантастики.
              Помню клиент выставляет претензии "почему PCIe x4, всего то на скорости х2.4 работает, и не пора бы что подкрутить в ответственных местах?"

                +1

                》PCIe x4, всего то на скорости х2.4 работает


                Хороший тест для программиста, как убедить клиента чисто программным решением, что PCIe слот х4 работает именно на этой скорости, а значит проблема со скоростью х2.4 в его железе?

              +4
              В PCI сейчас действительно творится бардак, каждая карточка думает что она одна и не стесняясь требует нехилые address ranges.
              Но ещё больше бардака добавляет код инициализации устройств. Я слегка прифигел когда разбирался почему половина функциональности одной карточки не заводилась в линуксе, там просто наплевали на все мыслимые стандарты (или даже не читали их).
              Ребята, там реальный треш-код.
              Что, BIOS уже пред-разметил карту памяти? нет, к чёрту, делаем по-своему…
              Оптимальное размещение ranges? не, зачем это… хватаем что под руку попадается, ну и что если будут неиспользуемые дыры в памяти — пусть пользователь ещё 16 гиг докупит…
              С искренним умилением жду когда в очередном release notes ядра появится заметка что удалось очистить этот мрак.
              Тот случай, когда имея гигагерцы и гигабайты пишется глупый код.
                0

                》Оптимальное размещение ranges? не, зачем это…


                Помню, безуспешно, пытался объяснить на electronix.ru/forum/ почему биосу приходится перезагжаться 2-3 раза, если количество резервируемой памяти, под pci устройства, заранее не прогнозируемо + дикая грануляция. Нет, конечно можно отдать в резерв сразу 1Гиг, будет надёжно. Но всех ли устроит его "терять"?

                  –1

                  Учитывая, что память «виртуальная» не совсем понимаю — в чем проблем отдать хоть 1 ГиБ пространства под устройства

                    +2

                    Видимо именно для этого случая и существует опция "доступность памяти свыше 4Гб для PCI устройств ", но всегда по дефаулту она не активна. Хотя иногда и требуют обратного. Но требуют не часто.

                      0
                      64-битные PCI BARs линукс иногда игнорит и работает с ними как с 32-битными (да, я тоже был удивлён), если запрашиваемый range влезает в первые 4 гига памяти.
                      Так что эта опция как бы есть, но принимается к рассмотрению по усмотрению ядра.
                        0

                        Линуксы это как бы "семейство" оных, может что-то и прошло бы на серверной версии, серверной амд, убунту и прочие. Пробовать, не перепробовать, сколько их.
                        Но в первом приближении, вполне верю.

                  +3
                  каждая карточка думает что она одна и не стесняясь требует нехилые address ranges.

                  Хе-хе…
                  Помнится в 90е годы делал с отцом плату сопряжения АЦПУ7040 с ПК.

                  Шина — ISA. Элементная база — 555 вроде.
                  И столкнулись с такой проблемой: время действия сигнала AE на шине слишком маленькое для многокаскадной схемы на 555 микросхемах, имевшихся у нас наличии.
                  Дешифратор адреса просто не успел бы воспринять адрес.
                  Пришлось упрощать схему, а вместе с тем — «захватить» несколько огромных диапазонов портов ввода/вывода в системе ;)
                    0
                    Классный опыт, уважуха вам :)
                    В начале 90-х, когда я студентом в НИИ подрабатывал в лабе, у нас тоже была своя ISA-карточка для интерфейса к сканеру. Помню, как бородатые дядьки к ней что-то тут же за соседним столом допаивали и спорили. Прикольно было, воспоминания добрые остались…
                      +3
                      Собственно, я это тоже делал студентом на практике: программировать вроде немного научили, основы микропроцессорной техники тоже прошли.
                      Книжка «Аппаратная архитектура IBM PC» (так что-ли называлась) — прочитана.

                      А на заводе проблема: демонтируют последнюю ЕС1036, а к ней подключены 2 АЦПУ и присутствует большой объём печати.
                      АЦПУ-то печатает со скоростью пулемёта — чем её заменить-то?

                      Выдали мне на предприятии толстую папку с документацией на каналы ввода/вывода (КВВ) ЕС1036 — это специализированный процессор, разгружающий основной процессор системы от операций работы с медленной периферией. В частности — АЦПУ.
                      НМД и НМЛ вроде подключались как-то по-другому.

                      Поизучал я доку — вроде ничего заумного нет. Можно взяться. И взялись.
                      Я накидал идею, как это должно работать, как будет реализовано.
                      Нашёл по упомянутой книжке какой-то адрес, который вряд ли будет использоваться в разрабатываемой системе другим железом. Из имеющейся в наличии номенклатуры 555-микрух, накидал схемку. Всё — можно паять!
                      Руководителем практики был мой отец. Он как опытный электронщик, — сразу обратил внимание на тайминги и обозначил описанную выше проблему с дешифратором адреса.
                      Пришлось изворачиваться. Дешифратор у нас чуть-ли не двухкаскадным стал =D

                      Ну а потом — сборка навесным монтажом. Делали в двух экземплярах — на случай выхода из строя одного изделия.

                      Ну и — программёж: сама плата была простой — дешифратор адреса и пара 16-ти битных регистров вроде (1 на вход, 1 — на выход), — поэтому вся логика работы КВВ была реализована программно. Когда какой сигнал выставлять, что ждать в ответ — в документации на КВВ и на АЦПУ всё было хорошо расписано (что — что, а документацию в советские времена делали отличную!).

                      Ещё повезло, что периферия работала синхронно с КВВ: т.е. он выставил управляющий сигнал — в ответ устройство выставило что-то своё и пока КВВ держит управляющий сигнал — устройство держит свой. Ну и т.д. Никакой самодеятельности со стороны АЦПУ.
                      Это очень облегчало во-первых отладку, а во-вторых, не накладывало никаких ограничений на быстродействие управляющего компьютера. Хоть на Z80 делай :)
                      Подключили к персоналке на 95х виндах два этих АЦПУ. Использовалось два кабеля толщиной с большой палец каждый.
                      Два — потому что насколько я помню шина эта архитектурно была петлёй. Один кабель уходит «туда», второй — возвращается «оттуда».
                      Где-то я потом читал, что интерфейс SCSI по принципу работы очень был похож.

                      Так наша самоделка лет 12 что-ли проработала. Печатала не хуже ЕС1036.

                      А потом завод разорился на высокоскоростные матричные принтеры и АЦПУ в конце концов тоже списали.
                  +3
                  «640 килобайт 256 линий PCI хватит всем!»
                    0
                    Так а в чём собственно проблема? Количество доступных линий PCI\PCI-E постепенно увеличивается, скорость каждой из линий также растёт. Вам сейчас не хватает количества\скорости PCI\PCI-E линий? Если да, то просто опишите задачу, из-за которой вам их не хватает.
                      +1
                      Так речь же вроде бы не о ограничениях скорости, а количества независимых шин, не линий.
                        +3

                        Причем пока был чистый PCI была физическая возможность всунуть на одну шину несколько девайсов. А на PCIe эту "мелочь" упразднили. А ведь эта мелочь давала 7 кратный прирост количества и была задумана совершенно не просто так.

                          0
                          Ну положительные последствия тоже есть — избавились от pci lattency. Хотя обратная совместимость ещё икнётся, видимо.
                        +5

                        》Количество доступных линий PCI\PCI-E постепенно увеличивается,
                        Это плюс


                        》скорость каждой из линий также растёт.
                        И это плюс


                        》 Вам сейчас не хватает количества\скорости PCI\PCI-E линий
                        Не о том речь.


                        Сколько адресов, для своей инициализации, требует Р2Р мост? Типично 8? Даже если за ним будет всего 1 конечное устройство?
                        Можно эту "физическую конструкцию" вставить в слот?
                        Сколько слотов можно организовать у Rome/Naples? 48!
                        Вставляем во все 48 слотов по вышеописанную "физическую конструкцию ". Вопрос, сколько из мостов будпт проинициализировано, сколько конечных устройств за ними будет обнаружено?


                        Нам, всего то, требуется 8х48 PCI шин? Всего то 384? А у нас всего лишь 176 ( т.е.256-80). Большая часть конечных устройств "логически" потеряны ?

                          +7

                          Если вы считаете что 48 слотов это "немножко много ", то вы давно не были на embedded World в Нюрнберге
                          https://www.embedded-world.de/

                          +2

                          Правдааааа? Да согласен оно может и увеличивается. Но, есть pcie 4.0 — для него разветвители ещё почти в лабах делают, а если их нет, то выдаёт проц 16 линий, вот и кушай пожалуйста потребителюшка эти 16 линий.
                          Грядёт USB 4.0, где будет обязательным наличие нескольких линий pcie, и я имею ввиду самую максимальную конфигурацию usb 4, а nvme уже пришёл — раньше портов сата было штук 8, можно ли в потребительском ПК замутить полноценные 8 nvme портов а?, чтобы при этом было 2 видюхи в полноценном sli, плюс чтобы работала звуковуха воткнутая в этот же pcie, ещё плату видеозахвата тоже на pcie, ну сейчас же есть RT/RA, так что нужно ещё одну видюшку под лучи/physx хотябы на x8, ах да добавьте переносные накопители, сейчас на плате я вижу около 8 usb. И так дорогой сударь дайте мне овердохренища pcie линий. И ненадо впаривать, что вот они потом будут — потом будут и pcie 6, 7, 8, etc которым нужно тоже скорости повышать (а я так понимаю либо в ширь либо в даль — т.е. либо скорость увеличивать переходя на новое поколение, либо количество старого поколения увеличивать), потом будут также usb 5, etc это тоже эпопея как и с pcie и nvme так же. И в итоге линий не будет достаточно никогда, потому что постепенно во все интерфейсы встраиваются хотябы по одной линии pcie, может скоро LPTe увидим (шутка).
                          Предвижу интерфейс, который напрямую подсоединяет интхернет с pcie) (если он уже не существует).
                          Ниже утверждают, что "вот если нужно, то придумают новую шину", да вот только скорости где взять? Всё это приходит в проц, а проц потом обрабатывает, где ему процессорное время взять на все эти устройства? Уже давно бы так сделали, если бы мощи проца хватало. Скорее всего процессоры того времени могли "выдержать" новую линию PCIe, вот и перешли…

                          +1
                          Вой ни о чем.
                          Будет новая шина, если этого потребует рынок. Вот и всё.
                          Не первый раз.
                            +2

                            Будет новая шина — и будет сломана совместимость. Весь конструкт pci-e софтварно выглядит как «старый» «добрый» pci, как раньше. Со всеми ограничениями. Это как с 640кб и лимитом 1мб — а индустрия отгребает до сих пор. Или как с ipv4 — переход на ipv6 фактически означает сделать «новый интернет с нуля»

                              +1
                              Ну с AGP и ISA же перешли на PCI-e. Я даже помню те времена, достаточно безболезненно. Просто одновременно существовали комбинированные мамки, на которых было несколько вариантов шины. Потом устаревшие просто безболезненно умерли.
                              Здесь будет также.
                                +1

                                Программно — agp, pci, pci-e плюс минус одно и тоже с программной стороны.
                                ISA же совсем другое дело было (((

                            –4
                            Кто сейчас помнит такой архаизм как «Архитектура»? Мало кто. Слово в станкостроении стало в IT, практически ругательным. А ведь когда-то, в былые времена, книга «PCI System Archetecture» и прочие, зачитывалась до дыр, на экране.

                            Сам придумал проблему, сам поплакал.

                              0
                              Страшная цифра — 256

                              Может число?
                                +2

                                Формально – да, должно быть "число".


                                Но язык – штукенция весьма живая, и, емнип, где-то на хабре уже было обсуждение, в котором была озвучена позиция "Допустимо использовать "цифру" как обозначение неопределённого числа или указания порядка числа". Или как-то так. В общем, не суть важно, имхо.


                                Кроме того, тут словосочетание "страшная цифра" – устоявшееся, тогда как "страшное число" встречается мне сильно реже.


                                Правда, первый пункт здесь не подходит, 256 – вполне себе определённое число.

                                +1
                                Страшная цифра — 256. Хотя, на первый взгляд, и не очень страшная. Да, именно столько, и есть максимальный предел присутствия независимых PCI устройств, на PCI шине.

                                Здесь что-то не сходится: даже в Conventional PCI конфиг-спейс рассчитан на 256 шин по 32 устройства на каждой.
                                  +1

                                  》в Conventional PCI … по 32 устройства на каждой


                                  Именно что на PCI, увы на PCIe это полезное начинание было упразднено. Практика показывает что 1 слот, в нем 1 шина, исключительно на 1 устройство. Печаль.

                                    0

                                    Ну, не правда. Бывает вполне себе древовидная топология. Вот мой ноут (старенький уже):


                                               +-1c.0-[01-39]----00.0-[02-39]--+-00.0-[03]--
                                               |                               +-01.0-[04-38]--
                                               |                               \-02.0-[39]----00.0  Intel Corporation DSL6340 USB 3.1 Controller [Alpine Ridge]
                                      0
                                      увы на PCIe это полезное начинание было упразднено.

                                      Но адресация-то какая была в стандарте PCI, такая и осталась в PCIe. Не делают такого железа — может быть, но проблема не в PCI шине, а в чём-то другом…
                                    +1

                                    Ну не нагоняйте уж совсем истерику. Во-первых, у нас произведение числа свободных шин на число устройств на шине. Во-вторых, многие устройства (многоголовые) прекрасно используют третью размерность — функцию. (bus/slot/function). Получающееся декартово произведение покрывает всё что мы можем себе представить с головой. Даже в условиях PCI-E-коммутаторов и U.2 enclosures.


                                    В-третьих, как только запахнет в этом районе жаренным, просто сделают поддержку нескольких контроллеров. Сделают аналог NUMA для PCI, делов-то.

                                      +1

                                      Дак в PCI всё для этого уже есть — буковка S в SBDF — целых 16 бит — четвёртое измерение. Более того, PCI-E позволяет уже использовать разные сегменты: Если ОС не дремучая и умеет понимать ACPI MCFG таблицу, то проблемы никакой нет уже сейчас.


                                      Описываемая в статье проблема — это проблема реализации платформы: никто не мешает прямо сейчас завести на платформе несколько сегментов, подправить BIOS, чтобы он отдавал в ACPI MCFG, где искать базовый каждого адрес сегмента и всё.


                                      Все основные/встроенные устройства — подключаем в сегмент 0, чтобы старые ОС могли запуститься (которые умеют только PCI CSAM #1). Первый слот расширения — сюда же, все остальные слоты — в отдельный сегмент. И вот, оплакиваемая система с 64-я ядрами и 48 слотами уже может иметь 48 отдельных сегментов, в каждом из которых по 256 отдельных шин.


                                      Ну а проблема 4G решается введением требования поддержки 64-битного адреса для всех новых устройств в новых стандартах: устройства старых стандартов, не умеющие 64-битный адрес, будут ютиться в младших 4G, всем умеющим — выдавать окна выше.

                                        0
                                        Ну а проблема 4G решается введением требования поддержки 64-битного адреса для всех новых устройств в новых стандартах: устройства старых стандартов, не умеющие 64-битный адрес, будут ютиться в младших 4G, всем умеющим — выдавать окна выше.

                                        А ещё есть IOMMU, которое решает эту проблему для старых устройств. (Правда на практике для VT-d у нас всегда было проседание пропускной способности при его включении.)

                                        +2

                                        Добавлю к тексту выше: похоже, что ради совместимости есть проблема и на стороне ПО (ОС и/или BIOS) — в, частности, в Linux отображаются явно разные сегменты — сегменты разных сокетов — в нулевой сегмент. Столкнулся с данной проблемой буквально в прошлом месяце, а мне нужно отличать устройства по физическим сегментам.


                                        Кто виноват и что делать, добавлю позже, как разберу проблему.

                                          0

                                          Я не знаю на каком уровне вы проблему решаете. В userspace lspci -vvvv даёт много информации об устройствах, и система кодирования адресов в userspace, насколько я понимаю, это всего лишь условность. Внутри ядра я ничего существенного сказать не смогу.

                                            +1

                                            Нет, всё оказалось проще: нашлась старая ошибка в моём коде, которая проявляется только на некоторых многосокетных платформах. Так что пока всё хорошо, но вопрос будет изучаться дальше и по мере поступления в распоряжение новых платформ будут появляться новые данные.

                                              +1

                                              》некоторых многосокетных платформах. 
                                              Иногда, чтобы что-то искать, надо хотя бы знать примерное направление движения.
                                              Спасибо за "S". Она действительно в коде появилась у Амд. Но 7 лет назад у Интела, однозначно не было, Буду копать.


                                              》умеет понимать ACPI MCFG таблиц


                                              Ой, так вам можно и по ACPI вопросы по дебагу термальных зон, процессорных частот и пр., пытаться задавать?))))

                                                +1
                                                Иногда, чтобы что-то искать, надо хотя бы знать примерное направление движения. Спасибо за "S". ...

                                                Она была в PCI всегда, если не ошибаюсь: как минимум, с PCI 2.0 — сразу разумно предположили возможность масштабирования.


                                                Она действительно в коде появилась у Амд. Но 7 лет назад у Интела, однозначно не было, Буду копать.

                                                Толку от кода — ноль, если аппаратура не поддерживает несколько сегментов. В случае многопроцессорных систем самое очевидное решение — как раз заводить по сегменту на сокет. А можно и по несколько.


                                                Нет, я не прав: если ОС не полезет перенумеровать PCI, то можно в БСВВ (UEFI в вашем случае) обычный PCI мост отдавать как отдельный логический сегмент — тогда ваша проблема решена.


                                                P.S. Я бы добавил прямо в текст статьи обновление в конце с информацией из комментария выше об ACPI MCFG и предыдущего параграфа данного комментария, чтобы наступившие на ту же проблему быстрее нашли решение.


                                                Ой, так вам можно и по ACPI вопросы по дебагу термальных зон, процессорных частот и пр., пытаться задавать?))))

                                                Я периодически мимо тем вашего ника прохожу, но мне лучше знакомы Das U-Boot и некоторые ARMы, чем Intel/AMD и UEFI (но и последних иногда приходится касаться).

                                                  +1

                                                  》случае многопроцессорных систем самое очевидное решение — как раз заводить по сегменту на сокет


                                                  В том то и дело что я ее, в качестве маппинга PCIe пинов на второй процессор, распознал по контексту, а то что этот второй(N-ный) сегмент получит нумерацию адресной шины с 0, мысль не пришла.


                                                  》мне лучше знакомы Das U-Boot и некоторые ARMы


                                                  А это ещё одна интересная тема, как ACPI таблицы "одомашнили" под АRM, в угоду ОС. Но их и U-Boot, я касался только один раз, а Линукс и так работал вроде, и не сильно требуя наличия/ковыряния ACPI.

                                                    +1
                                                    «Вот и встретились два одиночества...»
                                                    Хабр торт (и не спорьте).
                                                    Где ещё в наше то время два (не кворум, кстати) биосописателя встретились бы и обменялись опытом с ненулевым выхлопом?
                                        –3

                                        (вытирая текущую из глаз кровь) Автор, отдайте статью кому-то на вычитку. Я отправил Вам около двадцати пунктуационных ошибок — и ещё не дошёл даже до середины статьи. Я не могу так больше! Вам, похоже, за количество поставленных запятых платят, что Вы лепите их по поводу и без повода.

                                          +1

                                          Как только доберусь до большого компьютера, думаю в рабочий день, обязательно всё исправлю.


                                          Спасибо за ваше мнение.

                                          +1
                                          Печаль только в том, что новые сегменты растут исключительно(я так пока понял) из дополнительных физических процессоров.

                                          Тут такое дело, что чтобы данные пересылать между устройством и/или памятью via ПДП (DMA), то для начала нужно это самое устройство подключить к ЦПУ и/или контроллеру ПДП. И вот это вот самое соединение в современных Intel и AMD ЦПУ внутри, а наружу торчат корневые мосты.


                                          Вот эти корневые мосты и должны получать собственные сегменты PCI.


                                          Но для ПО всё равно, физические это сегменты или логические пока ПО не пытается перенумеровать PCI устройства. Так что, как я заметил выше, если ОС этого не пытается делать (по умолчанию), а процедура перенумеровки в БСВВ (BIOS, UEFI, U-Boot, et cetera) под нашим контролем, то ничто не помешает нам считать некоторые PCI мосты корневыми собственных логических сегментов.


                                          Какие именно мосты считать таковыми, можно определять по физическому подключению (по пути в иерархии) или по vendor:device + svendor:sdevice — последняя пара предназначена для задания OEM и, обычно, легко меняется (например, в EEPROM). Первое решение специфично для каждого конкретного типа платформы (схема соединений), второе — универсально.


                                          Можно для тестов попробовать экстремальный вариант:

                                          Вообще всем мостам давать логические сегменты, тогда будет bus = 0 для всех устройств, но как на это отреагируют ОС — нужно тестировать. Не факт, что им понравится. Не понравится — ошибка ОС, однозначно.


                                          Более того, то, что это возможно, подтверждает следующий факт: на практике БСВВ до сих пор продолжают отображать эти физические сегменты в один логический (нулевой) исключительно ради совместимости с древними x86. (Вы давно видели более, ли менее современную систему x86/amd64, не умеющую ACPI? Вот, и для меня загадка, зачем они это продолжают делать.) Вот отбирание PCI шин у нулевого логического сегмента — это как раз оно и есть. (Шины в PCI всегда логические — это понятие существует исключительно для построения плоского отображения PCI иерархии устройств.)


                                          Вот, для примера проблема для E5-2620v4 со штатной процедурой перенумерации для UEFI:

                                          Из-за отображения физических сегментов в нулевой логический у нас получаются одинаковые PCI пути для разных устройств:


                                          path    = 0/14.0
                                          slot    = 14.0
                                          class   = 0c03.30
                                          vendor  = 8086
                                          device  = 8d31
                                          svendor = 1043
                                          sdevice = 85f6
                                          
                                          path    = 0/14.0
                                          slot    = ff:14.0
                                          class   = 0880.0
                                          vendor  = 8086
                                          device  = 6fb0
                                          
                                          path    = 0/14.0
                                          slot    = 7f:14.0
                                          class   = 0880.0
                                          vendor  = 8086
                                          device  = 6fb0

                                          — а должно быть что-то вроде 0/14.0, 1/14.0, 3/14.0 (первая цифра — номер сегмента, далее dev.func для всех устройств в иерархии, разделённые «/»).

                                            +1

                                            Буду много думать. Спасибо

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое