Jump to content

    

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

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

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

Share this post


Link to post
Share on other sites
12 hours ago, mantech said:

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites
10 минут назад, Integro сказал:

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

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

Share this post


Link to post
Share on other sites
53 minutes ago, mantech said:

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

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

image.png.dc9401955498b8fa8173b4bb56cba736.png

Share this post


Link to post
Share on other sites
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();
}

 

Edited by mantech

Share this post


Link to post
Share on other sites

Так а где установка 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

 

 

Edited by Integro

Share this post


Link to post
Share on other sites

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

Edited by GenaSPB

Share this post


Link to post
Share on other sites
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ГБ, доступный для кеширования, согласно таблице, но .... Это же английское поделье, поэтому может логики тут нет...

Edited by mantech

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
12 минут назад, GenaSPB сказал:

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

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

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

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

Edited by mantech

Share this post


Link to post
Share on other sites
43 minutes ago, mantech said:

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

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

Share this post


Link to post
Share on other sites
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));
Edited by mantech

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
3 minutes ago, mantech said:

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

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

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now