Перейти к содержанию
    

Cortex A7 и А8, А9 Различия в запуске MMU и кэшей

Приветствую.

Что-то упустил при переходе с Кортекса А8 на А7, что скорость несколько упала, особо пока не замечал, но начал тестирование производительности и понял, что она упала в несколько раз. Вопрос, насколько сильны различия в инициализации?  Читал книжку "английских ученых" и , честно говоря, разницы не заметил, может туплю?  Если есть мнение буду рад услышать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, mantech said:

что скорость несколько упала

Скорость чего упала? Что и как тестируете?

Такие параметры как: частота ядра и тип\частота DDR одинаковы для обоих проектов? По-этому сразу подумали что cache не работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Cortex-A9  и ARM9 data cache работал только если MMU включено

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, Integro сказал:

Такие параметры как: частота ядра и тип\частота DDR одинаковы для обоих проектов? По-этому сразу подумали что cache не работает?

Да, частота одинаковая, счетчик производительности то же, при полном отключении ММУ и кэшей показывает примерно одинаковый результат, у А7 чуть повыше.  Как показал анализ не работает кэш данных, включение и отключение кэша инструкций показывают практически одинаковые результаты на обоих платформах, включение кэша данных не приводит ни к какому либо увеличению производительности на А7, но на экране появляются артефакты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

53 minutes ago, mantech said:

включение кэша данных не приводит ни к какому либо увеличению производительности на А7

Для А7, bit ACTLT.SMP должен быть в единице перед включением cashe, есть такое?

image.png.dc9401955498b8fa8173b4bb56cba736.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Integro сказал:

есть такое?

Если это в регистре включения ММУ, то биты С и I в единице, а если это другой регистр, то его б название??

 

Нашел, но этот бит уже установлен "до меня".

 

Читаю MRC p15, 0, , c1, c0, 1 ;

Получаю - 0x00006040   странно...

 

Вот код инициализации ММУ и кэша.

void mmu_system_init(__u32 dram_base, __u32 dram_size, __u32 mmu_base)
{
	__s32   *mmu_tlb_address = (__s32 *)mmu_base;
	__u32    i;



	for(i = 0; i < 4 * 1024; i++)
	{

		mmu_tlb_address[i] = ((i << 20))   |
							  (0 << 19)    |
							  (0 << 18)    |
							  (0 << 17)    |
							  (0 << 16)    |
							  (0 << 15)    |
							  (0 << 12)    |
							  (3 << 10)    |
							  (0 <<  9)    |
							  (15 << 5)    |
							  (0  << 4)    |
							  (0  << 3)    |
							  (0  << 2)    |
							  (2  << 0);


	}
	//cache sram
	mmu_tlb_address[0] = (0 << 20)    |         //
						 (0 << 19)    |         //
						 (0 << 18)    |         //1Mpage
						 (0 << 17)    |         //not global
						 (0 << 16)    |         //not shared
						 (0 << 15)    |         //
						 (0 << 12)    |         //
						 (3 << 10)    |         //
						 (0 <<  9)    |         //
						 (15 << 5)    |         //
						 (0  << 4)    |         //
						 (1  << 3)    |         //cache
						 (0  << 2)    |         //buffer
						 (2  << 0);             //
	//cache dram
	for(i = 0; i < dram_size; i++)
	{
		mmu_tlb_address[i + (dram_base>>20)] = (dram_base + (i << 20))  |
									     (0 << 19)    |
										 (0 << 18)    |
										 (0 << 17)    |
										 (0 << 16)    |
										 (0 << 15)    |
										 (0 << 12)    |
										 (3 << 10)    |
									     (0 <<  9)    |
										 (15 << 5)    |
										 (0  << 4)    |
										 (1  << 3)    |
										 (0  << 2)    |
										 (2  << 0);

	}
	//set ttb

	mmu_flush_TLB();
	mmu_base |= (1 << 0) | (1 << 1) | (2 << 3);
	__asm("mcr p15,0,%0,c2,c0,0"::"r"(mmu_base));
	__asm("mcr p15,0,%0,c2,c0,1"::"r"(mmu_base));

	//clean i/d cache
	flush_icache();
	flush_dcache();
	//set domain controller
	mmu_set_domain_access();
	return ;
}

void   mmu_enable( void )
{
	__u32 c1format = 0;
	//__u32 c1format1 = 0;

	__asm("mrc p15,0,%0,c1,c0,0":"=r"(c1format));
	//c1format1=c1format;
	c1format &= ~ 0x1007;
	c1format |= 0x1005;
	__asm("mcr p15,0,%0,c1,c0,0"::"r"(c1format));

	//printf("MMU-%08x,<%08x>\n",c1format1,c1format);



	//enable_icache();
	//enable_dcache();

	//enable_prediction();
}

 

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так а где установка ACTLR.SMP?
Его нужно включать самым мервым до mmu
 

Вот что еше пишут: стр 141

Quote

All Write-Back memory can be cached when ACTLR.SMP is set to 1, the MMU is enabled, and SCTLR.C is set to 1.

 

 

Quote

To access the ACTLR, read or write the CP15 register with:
MRC p15, 0, <Rt>, c1, c0, 1 ; Read Auxiliary Control Register
MCR p15, 0, <Rt>, c1, c0, 1 ; Write Auxiliary Control Register

To access the SCTLR, read or write the CP15 register with:
MRC p15, 0, <Rt>, c10, c2, 0    ; Read Primary Region Remap Register
MCR p15, 0, <Rt>, c10, c2, 0    ; Write Primary Region Remap Register

MRC p15, 0, <Rt>, c1, c0, 0 ; Read System Control Register
MCR p15, 0, <Rt>, c1, c0, 0 ; Write System Control Register

 

 

Изменено пользователем Integro

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас тут magic numbers... лень интерпретировать для проверки. в дескрипторах страниц для ОЗУ тоже надо ставить про cache & write back

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Integro сказал:

Так а где установка ACTLR.SMP?
Его нужно включать самым мервым до mmu

Так вроде писал, что этот бит уже установлен либо по умолчанию, или бутлоадером. Его надо снова переустановить или сбросить и установить заново? Хотя устанавливал, в самом начале функции mmi_system_init , но ничего это положительного не дало, что не удивительно, в связи с вышеописанным...

 

1 час назад, GenaSPB сказал:

У Вас тут magic numbers... лень интерпретировать для проверки. в дескрипторах страниц для ОЗУ тоже надо ставить про cache & write back

В смысле?  Таблица на А8 исправно работает. Хотя, буду рад, если кинете ссылочку на нормально описанные поля этой таблицы...

1 час назад, Integro сказал:

MRC p15, 0, <Rt>, c10, c2, 0    ; Read Primary Region Remap Register
MCR p15, 0, <Rt>, c10, c2, 0    ; Write Primary Region Remap Register

про с10 не помню, надо посмотреть..

Можно-ли по этой комнде чуть по-подробнее, я чего-то раньше с таким ужОсом не встречался никогда...:cray2:

ЗЫ. Виртуальных адресов не использую, только реальные физические адреса. По логике, по умолчанию должнен быть один физический регион 4ГБ, доступный для кеширования, согласно таблице, но .... Это же английское поделье, поэтому может логики тут нет...

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, GenaSPB сказал:

ARM DDI 0464F - Table 5-1 (страница 141) например.

Вот или туплю или просто не могу понять эту обратную английскую запись. По моему в моем исходнике и то понятнее написано, но не все поля правда...

Например, что означают первые 2 бита, 3-разрешение буферизации, 4- режим кэширования и т.д.  Вот что-то такое бы заиметь... 

ЗЫ, что означает global, shared и т.д....

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, mantech said:

про с10 не помню, надо посмотреть..

Да, это нето. Тупанул, поиском быстро нашел SCTRL, но там должен быть с1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Integro сказал:

но там должен быть с1.

Так вроде с с1 там все норм... включаются I(12 бит) и D(2) кэши и ММУ (0й бит). все в единицах...

__asm("mrc p15,0,%0,c1,c0,0":"=r"(c1format));
	//c1format1=c1format;
	c1format &= ~ 0x1007;
	c1format |= 0x1005;
	__asm("mcr p15,0,%0,c1,c0,0"::"r"(c1format));
Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нас интересует write back - которую они как buffer назвали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, mantech said:

Так вроде с с1 там все норм...

Если все три бита стоят, значит кеш должен работать, нужно регионы проверять

Ну и артифакты на экране вроде как косвенный признак. Кстати они должны быть? В коде еще нет соответвующего менежмента?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...