Сборка Linux и CPSS на отладке Marvell с Ethernet-коммутатором Prestera DX

Мы подготовили статью-гайд для пошаговой сборки и запуска базовой прошивки с CPSS на отладочной плате Marvell RD-AC3X-48G4X2XL-A. Эта плата предназначена для проектирования и отладки управляемых коммутаторов до 48 портов. Чем она примечательна для инженера-разработчика? У нее на борту установлен коммутатор Marvell Prestera DX 98DX3257 с мощной СнК семейства Prestera. А Ethernet-коммутаторы Prestera DX позволяют реализовать 5G при самой низкой в отрасли мощности и занимаемой площади.

А что касается CPSS, то это базовый программный уровень для железа Marvell Prestera или другими словами Core Prestera Software Suite. CPSS — часть открытой сетевой операционной системы SONiC от Open Compute Project. Эта операционка расширяет функции центра обработки данных в сложных системах, например, в системах интеллектуального хранения данных и машинного обучения. А еще высокоуровневое API CPSS примечательно тем, что для его использования и подключения возможностей Marvell Packet Processor разработчикам не требуются глубокие знания регистров и таблиц чипсетов Prestera.

CPSS находится в пространстве пользователя. В нем есть несколько функций, которые требуют поддержки конкретного ядра:

  • Прерывания: для пересылки прерываний Packet Processor в CPSS требуется специальный модуль ядра.
  • Пакет to-and-fro CPU: для передачи пакетов между интерфейсом PCIe в выделенную память SDMA требуется другой модуль ядра.
С помощью этого API можно полностью настраивать свитч на базе Prestera.
На нашей отладке уже есть u-boot, он загружается в nand-память устройства на стороне производителя. Для дальнейшей работы вам понадобится создать аккаунт на портале Marvell.

Шаг 0: Создать рабочую директорию

mkdir ~/marvell && cd marvell

Ниже будут перечислены нужные компоненты для загрузки и распаковки в этой директории (~/marvell), относительно нее будут указаны все пути в этой статье.

Итак, начинаем работу с раздела раздела Products на портале Marvell:

Шаг 1: Скачать toolchain (компилятор и пр.) для сборки ядра и cpss-приложения

1.1 Зайти на портал Marvell и выбрать в центре сверху Products.

1.2 Далее в меню слева: Tools→Marvell GNU Tools→MGCC-5→201511.

1.3 Выбираем в окне справа Toolkit и скачиваем нужный тулчейн. На момент написания статьи это armv7 marvell linux gnueabihf hard 5.2.1 x86_64 20160301.tar.xz.

1.4 Распаковываем архив в рабочую директорию.

Шаг 2: Скачать сборочную систему Marvell с исходниками CPSS

2.1 В том же разделе Products на портале Marvell выбираем в меню слева Switching→Software →CPSS-DXCH→4.2.2020.3.

2.2 Нажимаем в окне справа Base SDK и скачиваем CPSS 4.2.2020.3 release - GIT Source.

2.3 Распаковываем архив в рабочую директорию.

Шаг 3: Скачать инструкцию по сборке и использованию образа Linux Marvell и CPSS

3.1 Снова в разделе Products выбираем в меню слева Switching→Software →cpss→4.2.2020.3.

3.2 Нажимаем в окне справа User Guide и скачиваем PSDK PIPE 4.2.2020.3 Release – User Guide.

3.3 User Guide — набор html-страниц для браузера. Для просмотра распаковываем архив и открываем страницу в корне – PSDK_home.html.

Шаг 4: Клонировать ядро Linux-Marvell с Marvell Github и настроить его

4.1 git clone https://github.com/MarvellEmbeddedProcessors/linux-marvell.git

4.2 mv ./linux-marvell ./cpss_release_git_CPSS_4.2_2020_03_018/kernel

Обратите внимание: ядро должно лежать рядом с исходниками cpss и называться kernel.

4.3 cd ./cpss_release_git_CPSS_4.2_2020_03_018/kernel

4.4 git checkout remotes/origin/linux-4.4.52-armada-17.10

4.5 export ARCH=arm && make mvebu_v7_lsp_defconfig

Далее включаем поддержку RAM-диска в ядре. Для этого есть два способа:

– через make menuconfig

– прописать в файл .config:

CONFIG_BLK_DEV_RAM=y

CONFIG_BLK_DEV_RAM_COUNT=2 (максимально возможное количество РАМ-дисков)

CONFIG_BLK_DEV_RAM_SIZE=524288 (максимальный размер RAM-диска в кб, который поддерживает ядро; 524288 – 512 мб)

Шаг 5: Настроить рабочее окружение

Процесс настройки изучаем в User Guide из Шага 3.

5.1 cd PSDK_PIPE_4.2.2020.3_UserGuide

5.2 Открываем PSDK_home.html.

5.3 CPSS User Guide слева.

5.4 Слева на экране: Building CPSS → Building CPSS in Linux → Installing the Development Environment.

5.5 Tool Chain Installation пропускаем, мы уже его установили. Обращаемся к Configuring the Development Environment. Там делаем все дальнейшие настройки.



Следующие шаги с 6 по 12 выполняем в директории ./cpss_release_git_CPSS_4.2_2020_03_018/cpss

Шаг 6: Собрать ядро и дерево устройств

6.1 git checkout cpss_4.2

6.2 make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y kernel

Шаг 7: Собрать CPSS

make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y appDemo

Шаг 8: Собрать модули ядра для работы CPSS

make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y modules

Marvell предоставляет 3 модуля ядра:

  • mvIntDrv.ko — для обработки прерываний от/для Packet Processor
  • mvDmaDrv.ko — для выделения памяти DMA, которая передает пакеты от/к CPU
  • mvMbusDrv.ko — для доступа к внутренним ресурсам при использовании внутреннего процессора Prestera
Теперь собираем файловую систему:

Шаг 9: Скачать busybox 1.21.1

Шаг 10: Исправить Makefile

Откройте корневой Makefile в cpss_release_git_CPSS_4.2_2020_03_018/cpss

и замените строку:

tools/build/rootfs/crfs.sh $(BUILD_FOLDER)/rootfs $(CROSS_COMPILE) /nfs/pt/swdev/areas/readonly/swtools/devsources/root_fs/files/busybox/busybox-1.22.1.tar.bz2; \

на:

tools/build/rootfs/crfs.sh $(BUILD_FOLDER)/rootfs $(CROSS_COMPILE) $(MY_DIR)/busybox/busybox-1.21.1.tar.bz2; \

Шаг 11: Собрать файловую систему

Файловая система будет храниться не «жёстко» на устройстве, а на RAM-диске, который будет загружаться в оперативную память устройства. Это самый выгодный вариант хранения, т.к. используемый объем памяти не превышает 256 Мб.

11.1 make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y rootfs

Мы уже собрали CPSS и модуль для работы с ним, выполняя шаги 7 и 8. Теперь копируем их в файловую систему:

11.2 cp compilation_root/cpss_4.2/armv7_DX/appDemo cpssEnabler/mainExtDrv/src/gtExtDrv/linuxNoKernelModule/drivers/mvDmaDrv.ko cpssEnabler/mainExtDrv/src/gtExtDrv/linuxNoKernelModule/drivers/mvIntDrv.ko cpssEnabler/mainExtDrv/src/gtExtDrv/linuxNoKernelModule/drivers/mvMbusDrv.ko compilation_root/cpss_4.2/armv7_DX/rootfs/home/user/

Компилируем образ файловой системы, который подходит для u-boot. Делаем это с помощью mke2fs и mkimage:

11.3 cd compilation_root/cpss_4.2/armv7_DX && mke2fs -L '' -N 0 -O ^64bit -d rootfs -t ext2 rootfs.ext2 256M && gzip rootfs.ext2 && mkimage -A arm -O linux -T ramdisk -C gzip -n "Build Root File System" -d rootfs.ext2.gz rootfs.ext2.gz.uboot && cd -

Ядро, дерево устройств и RAM-диск файловой системы загрузятся на устройство по протоколу TFTP. Также их можно записать в NAND-память устройства после окончания цикла разработки и отладки. Мы же остановимся на варианте с TFTP. Для этого потребуется соединение хост-машины с девайсом (Ethernet-порт на задней части корпуса девайса) и TFTP-сервер на хосте.

Шаг 12: Установить и настроить TFTP-сервер

12.1 sudo apt install -y tftpd-hpa

12.2 sudo systemctl enable tftpd-hpa && sudo systemctl restart tftpd-hpa

Копируем ядро, дерево устройств и RAM-диск файловой системы в директорию /var/lib/tftpboot. /var/lib/tftpboot — домашнюю для TFTP-сервера.

12.3 sudo cp ../kernel/arch/arm/boot/zImage ../kernel/arch/arm/boot/dts/armada-38x-interposer.dtb compilation_root/cpss_4.2/armv7_DX/rootfs.ext2.gz.uboot /var/lib/tftpboot/

Шаг 13: Настроить u-boot на устройстве

13.1 Подключаем Ethernet-кабель в порт MGMT на задней части устройства – это соединение для TFTP.

13.2 Подключаем кабель RS232 (хост) – RJ-45 (девайс) в порт CONSOLE — это ваша консоль.

13.3 Запускаем minicom для соединения с консолью устройства. Настройки порта: 115200 8N1.

13.4 Включаем устройство. Мгновенно загрузчик выдаст сообщение: "Hit any key to stop autoboot:". Нажмите любую клавишу, чтобы войти в меню настройки u-boot.

13.5 Последовательно выполняем следующие команды в консоли u-boot:

  • setenv bootcmd "run bootcmd_ram ;"
  • setenv bootcmd_ram "run tftp_ramdisk; setenv bootargs $console root=/dev/ram0 rw; tftp $loadaddr $image_name; tftp $fdtaddr $fdtfile; bootz $loadaddr ${ramdisk_addr}:${initrd_size} $fdtaddr ;"
  • setenv tftp_ramdisk "tftp $ramdisk_addr $ramdisk_name; setenv initrd_size ${filesize}"
  • setenv ramdisk_addr "0x05200000"
  • setenv ramdisk_name "rootfs.ext2.gz.uboot"
  • setenv console "ttyS0,115200"
  • setenv loadaddr "0x02000000"
  • setenv image_name "zImage"
  • setenv fdtaddr "0x1000000"
  • setenv fdtfile "armada-38x-interposer.dtb"
  • saveenv
13.6 Загружаемся! :-)

  • boot

Шаг 14: Проверить работоспособность CPSS-приложения на устройстве

Загружаем модули ядра:

14.1 cd /home/user && insmod mvDmaDrv.ko && insmod mvIntDrv.ko && insmod mvMbusDrv.ko

Запускаем CPSS-приложение:

14.2 ./appDemo

Попадаем в консоль CPSS-приложения. В консоли можем настраивать Ethernet-порты свитча и всю систему Prestera. Для проверки работоспособность приложения соединим Ethernet-кабелем один из портов свитча на передней панели (любой) со свободным портом на хост-машине. После объединения их в сеть пропингуем хост выполнением следующих команд:

14.3: autoInitSystem — инициализация системы Prestera — эта команда должна выполняться после каждой перезагрузки свитча.

14.4: Далее последовательно выполним следующие команды:

  • configure
  • mac address 00:00:00:00:11:22
  • interface ethernet 0/35
  • ip address <IP в одной подсети с хостом> <маска этой подсети>
  • force link up
  • end
  • traffic
  • protocol enable arp
  • protocol enable ping
  • ping <IP хоста, который хотите пропинговать>
Если пинг прошел, увидим следующее:
<Console(traffic)# ping 192.168.15.3>
<Pinging 192.168.15.3 using src mac: 00:00:00:00:11:22 src ip:192.168.15.10>
<Ping to ip 192.168.15.3 successful.>
Поздравляем! Вы только что настроили Linux и CPSS на отладке Marvell RD-AC3X-48G4X2XL-A с Ethernet-коммутатором Prestera DX! Полное описание команд CPSS находится в User guide из Шага 3 в разделе Lua CLI User Guide.
На фото: промышленный Ethernet-коммутатор 1Gb/10Gbps на базе OS Linux, разработанный на том же семействе сетевых чипов, что и отладка (48 нисходящих портов + 4 восходящих, рабочий диапазон от −20 до +70°C)
Поздравляем! Вы только что настроили Linux и CPSS на отладке Marvell RD-AC3X-48G4X2XL-A с Ethernet-коммутатором Prestera DX! Полное описание команд CPSS находится в User guide из Шага 3 в разделе Lua CLI User Guide.
Впервые эта статья была опубликована в нашем блоге на Хабре: «Сборка Linux и CPSS на отладке Marvell RD-AC3X-48G4X2XL-A с Ethernet-коммутатором Prestera DX»

Присоединяйтесь к нашей команде!

Приглашаем в нашу команду сетевого разработчика для развития направления Телеком