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

Есть ли какой-то единый способ разрешить кеш память в Risc-v - то что это работает совместно с mmu понятно  - но интересно как вообще это делается  или это у каждого производителя своё?

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

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


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

Пока запустил работу с прерываниями... usb и видео работает по наследству от T113-S3. Похоже, недостаточно полный контекст сохраняю в прерываниях - странности иногда творятся.

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

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


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

Да именно так и было. Все примеры в сети про 32 бит регистры  и без fpu.  Подсмотрел что делает компилятор в случае добавления атрибута machine для функции.

Осталось победить кеш память. Счётчик машинных циклов инкрементируется с правильной скоростью 1.2 ГГц а процессор едва ходит как будто на 24 МГц. 

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

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


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

Удалось получить нормальную скорость выполнения кода.
Кеши включаются специфицеским для данного ядра (C906) регистром MHCR:
 

Spoiler
	//	IE-Icache enable bit:
	//	• When IE=0, Icache is closed;
	//	• When IE=1, Icache is turned on.
	//	This bit will be reset to 1'b0.
	//	DE-Dcache enable bit:
	//	• When DE=0, Dcache is closed;
	//	• When DE=1, Dcache is on.
	//	This bit will be reset to 1'b0.
	//	WA - Cache Write Allocation Set Bits:
	//	• When WA=0, the data cache is in write non-allocate mode;
	//	• When WA=1, the data cache is in write allocate mode.
	//	This bit will be reset to 1'b0.
	//	WB - Cache Write Back Set Bits:
	//	• When WB=0, the data cache is in write through mode.
	//	• When WB=1, the data cache is in write back mode.
	//	C906 only supports write back mode, and WB is fixed to 1.
	//	RS-Address Return Stack Set Bits:
	//	• When RS=0, the return stack is closed;
	//	• When RS=1, the return stack is turned on.
	//	This bit will be reset to 1'b0.
	//	BPE - Allow Predictive Jump Set bit:
	//	• When BPE=0, predictive jumps are turned off;
	//	• When BPE=1, predictive jumps are turned on.
	//	This bit will be reset to 1'b0.
	//	BTB-Branch Target Prediction Enable Bit:
	//	• When BTB=0, branch target prediction is turned off.
	//	• When BTB=1, branch target prediction is on.
	//	This bit will be reset to 1'b0.
	//	WBR - Write Burst Enable Bit:
	//	• When WBR=0, write burst transfers are not supported.
	//	• When WBR=1, write burst transfers are supported.
	//	WBR is fixed to 1 in C906.


	// enable I-cache (C906-specific)
	if (1)
	{
		uint_xlen_t v;
		v = csr_read_mhcr();
		v |= (1u << 0);	// IE
		csr_write_mhcr(v);
	}

	// Allow Predictive Jump (C906-specific)
	if (1)
	{
		uint_xlen_t v;
		v = csr_read_mhcr();
		v |= (1u << 5);	// BPE
		csr_write_mhcr(v);
	}
	// Branch Target Prediction Enable (C906-specific)
	if (1)
	{
		uint_xlen_t v;
		v = csr_read_mhcr();
		v |= (1u << 6);	// BTB
		csr_write_mhcr(v);
	}
	// RS-Address Return Stack (C906-specific)
	if (1)
	{
		uint_xlen_t v;
		v = csr_read_mhcr();
		v |= (1u << 4);	// RS
		csr_write_mhcr(v);
	}


	// enable D-cache (C906-specific)
	if (1)
	{
		uint_xlen_t v;
		v = csr_read_mhcr();
		v |= (1u << 1);	// DE
		csr_write_mhcr(v);
	}

	// enable D-cache Write-allocate (C906-specific)
	if (1)
	{
		uint_xlen_t v;
		v = csr_read_mhcr();
		v |= (1u << 2);	// WA
		csr_write_mhcr(v);
	}

	// enable D-cache Write-back (C906-specific)
	if (1)
	{
		uint_xlen_t v;
		v = csr_read_mhcr();
		v |= (1u << 3);	// WB
		csr_write_mhcr(v);
	}

 

 

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


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

интересно, насколько этот alwiner соответствует этому коду?

https://github.com/T-head-Semi/opene906

---------------------------

насколько я знаю, стандартных CSR для кэша в архитектуре нету (то ли еще не стандартизировали - не успели, то ли считают, что кэш/ММУ отдельный юнит, не ядро)

в NOELV кэш управляется fence.i 

----------------------------

для кодов opene906  по-моему, много нестандартных расширений 

 

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


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

В даташите о нём и пишут. После стандартизированной по всем местам ARM как-то охреневаешь от разнообразия кастомных правок.

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


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

В 02.11.2022 в 09:59, GenaSPB сказал:

Пока запустил работу с прерываниями...

Ну и как впечатления относительно кортекса? На сколь читал, в данном ядре нет ускорителя типа кортексовского НЕОНа, что очень печально, или я чет не понял и там есть что-то подобное?

В 11.11.2022 в 16:45, GenaSPB сказал:

После стандартизированной по всем местам ARM как-то охреневаешь от разнообразия кастомных правок.

Дак это ж опенсорс, каждый правит как ему видится)))  Это как линукс, только аппаратный, ИМХО...

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


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

53 minutes ago, mantech said:

Ну и как впечатления относительно кортекса? На сколь читал, в данном ядре нет ускорителя типа кортексовского НЕОНа, что очень печально, или я чет не понял и там есть что-то подобное

Аппаратная плавучка одинарной и двойной точности есть.
Судя по всему, аналогом NEON тут будет расширение с поддержкой векторных вычислений - то что битом V обозначается...
Я в проекте использую CMSIS DSP, компилится и работает...

В CORTEX версиях я NEON не использую, только VFP

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

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


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

Подразобрался с загрузчиком с SPI NOR FLASH.
Научил свою утилиту формировать команду перехода на начало образа в кодах risc-v.
Выяснилось, что адрес загрузки всегда 0x20000 вне зависимости от того значения, что в заголовке написано.
Используемый мною код инициализации DDR(2) не очень работает на этом процессоре. А вариант прямого использования образа что грузит утилита xfel не получается простыми способами - скомпилировано под стартовый адрес 0x20000

 

https://raw.githubusercontent.com/ua1arn/hftrx/develop/tools/egontool/egontool.c

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

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


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

Разобрался с сильно мешавшей ошибкой в чужом коде управления кеш-памятью с использованием ассемблерных вставок.
Начиная с того что работало только на минимальном уроне оптимизации (-Og), так у оригинала была еще ошибка в коде операции dcache.cpa

Вот так выглядит работающее:
 

Spoiler


// Сейчас в эту память будем читать по DMA
void arm_hardware_invalidate(uintptr_t base, int_fast32_t dsize)
{
	if (dsize > 0)
	{
		//base &= ~ (uintptr_t) (DCACHEROWSIZE - 1);
		for(; dsize > 0; dsize -= DCACHEROWSIZE, base += DCACHEROWSIZE)
		{
			__asm__ __volatile__(
					"\t" "mv a0,%0\n"
					"\t" ".4byte 0x0265000b\n" /* dcache.iva a0 */
					:: "r"(base):"a0");
		}
		__asm__ __volatile__(".4byte 0x01b0000b\n":::"memory");		/* sync.is */
	}
}

// Сейчас эта память будет записываться по DMA куда-то
void arm_hardware_flush(uintptr_t base, int_fast32_t dsize)
{
	if (dsize > 0)
	{
		//base &= ~ (uintptr_t) (DCACHEROWSIZE - 1);
		for(; dsize > 0; dsize -= DCACHEROWSIZE, base += DCACHEROWSIZE)
		{
			__asm__ __volatile__(
					"\t" "mv a0,%0\n"
					"\t" ".4byte 0x0245000b\n" /* dcache.cva a0 */
					:: "r"(base):"a0");
		}
		__asm__ __volatile__(".4byte 0x01b0000b\n":::"memory");		/* sync.is */
	}
}

// Сейчас эта память будет записываться по DMA куда-то. Потом содержимое не требуется
void arm_hardware_flush_invalidate(uintptr_t base, int_fast32_t dsize)
{
	if (dsize > 0)
	{
		//base &= ~ (uintptr_t) (DCACHEROWSIZE - 1);
		for(; dsize > 0; dsize -= DCACHEROWSIZE, base += DCACHEROWSIZE)
		{
			__asm__ __volatile__(
					"\t" "mv a0,%0\n"
					"\t" ".4byte 0x0275000b\n" /* dcache.civa a0 */
					:: "r"(base):"a0");
		}
		__asm__ __volatile__(".4byte 0x01b0000b\n":::"memory");		/* sync.is */
	}
}

// Записать содержимое кэша данных в память
// применяется после начальной инициализации среды выполнния
void arm_hardware_flush_all(void)
{
	__asm__ __volatile__(".4byte 0x0010000b\n":::"memory"); /* dcache.call */
}

 

Танцы вокруг работы со специфическими для ядра С906 командами, которых не знает riscv gcc/as

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

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


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

On 11/12/2022 at 6:03 PM, mantech said:
On 11/2/2022 at 9:59 AM, GenaSPB said:

Пока запустил работу с прерываниями...

Ну и как впечатления относительно кортекса?

Подитожу.  Производительность на одинаковых мегагерцах сопоставима с кортексами А.

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


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

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

Подитожу.

Ясно. Если не секрет, в чем причина перехода с кортексов на данную платформу? Или это просто творческий интерес?

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


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

Творческий интерес. Ну очень много шума про risc-v вокруг,  а тут подвернулось устройство, которое можно запустить не изучая периферию а сосредоточившись чисто на новой архитектуре... на ядре.

Периферия этого процессора совпадает с t113s3 той же фирмы. Кроме специфического для ARM. И запущена Cmsis dsp библиотека. Этакий угон совершил. Но там качественно написано, всё просто комплиоируется.

Тестировал на проекте sdr. Те же openvg картинки гонял - как проверка устойчивости работы под нагрузкой для fpu.

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

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


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

10 часов назад, GenaSPB сказал:

Творческий интерес. Ну очень много шума про risc-v вокруг

Понятно)))

 

10 часов назад, GenaSPB сказал:

Кроме специфического для ARM

Вот это и напрягает, для АРМа все уже изъезжено вдоль и поперек, поэтому пока на нем и остановлюсь)))

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


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

Специфическое это gic, mmu, axi в ccu.. кеш. 

T113s3 это два ядра а не одно, тут чего уж сравнивать... в dsp приложениях у  меня существенно. 

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


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

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

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

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

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

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

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

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

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

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