Как указать смещение физической памяти для платформы ARM, которая использует ARCH_MULTIPLATFORM = y? - PullRequest
0 голосов
/ 06 января 2019

Справочная информация:

Я работаю над обновлением ядра до версии 4.9 на SoC на базе ARMv7. Ранее ядро ​​использовало одноплатформенную сборку (ARCH_MULTIPLATFORM = n), и, следовательно, PHYS_OFFSET был включен для принятия моего системного начального физического адреса оперативной памяти. С новым ядром, включенным деревом устройств и включенным ARCH_MULTIPLATFORM, в конфигурации ядра нет параметров для установки значения phy_offset.

Проблема:

Физический начальный адрес оперативной памяти моей платформы: 0x8000_0000. Но видеоподсистема использует первые 16 МБ для буфера видеокадров, поэтому физический начальный адрес ОЗУ системы будет 0x8100_0000. Я указал узел памяти дерева устройств, как показано ниже:

memory {
         device_type = "memory";
         reg = <0x81000000 0X1e000000>;
     };

После загрузки системы ядро ​​работает без проблем, пока не включится видео. В тот момент, когда видеоподсистема запускается с использованием назначенной области памяти (от 0x80000000 до 81000000), происходит сбой linux.
После анализа распределения памяти было обнаружено, что системное ОЗУ использует область ОЗУ кадрового буфера, несмотря на то, что начальный адрес в дереве устройств ее опускал, но распределение памяти не изменяется.

EVONLY_ENV$cat /proc/iomem
40415000-40415fff : serial
40416000-40416fff : serial
40430000-40430fff : serial
40431000-40431fff : serial
40432000-40432fff : serial
40500000-40500fff : /amba/eth0@40500000
40600000-40600fff : /amba/eth1@40600000
80000000-8effffff : System RAM
80008000-807fffff : Kernel code
80e00000-80e7860f : Kernel data

Также попытался добавить узел зарезервированной памяти с областью буфера кадра, зарезервированной директивами no-map:

 memory {
     device_type = "memory";
     reg = <0x80000000 0x20000000>;
 };

 reserved-memory {
     #address-cells = <1>;
     #size-cells = <1>;
     ranges;

     /*16 MB video RAM at the start*/
     vid_ram: vram@80000000 {
         reg = <0x80000000 0x1000000>;
         no-map;
     };

Как полностью исключить начальное пространство ОЗУ 16 МБ, используемое Ядром для подкачки?
Есть ли варианты дерева устройств для этого? Или какие-либо параметры командной строки?

Я ищу следующую схему распределения системной памяти после устранения проблемы (вывод из моей старой версии ядра без поддержки дерева устройств и многоплатформенности):

EVONLY_ENV$cat /proc/iomem
40100800-401008ff : pdriver
40415000-4041501f : serial
40416000-4041601f : serial
40430000-4043001f : serial
40431000-4043101f : serial
40432000-4043201f : serial
40c00000-40c001ff : sdhc0
40c01000-40c011ff : sdhc1
40c02000-40c021ff : emmc
70800000-77ffffff : PCI Memory Space
81000000-8fffffff : System RAM
81008000-81626be7 : Kernel code
81d9c000-81e5dff3 : Kernel data
...