LINUX.ORG.RU

Адресация и DMA

 ,


0

1

Доброго времени суток. В ядре есть сетевой драйвер от altera /kernel/driver/net/ethernet/altera/. Я использую его в своем проекте. В драйвере реализована следующая функция

static int tse_init_rx_buffer(struct altera_tse_private *priv,
			      struct tse_buffer *rxbuffer, int len)
{
	rxbuffer->skb = netdev_alloc_skb_ip_align(priv->dev, len);
	if (!rxbuffer->skb)
		return -ENOMEM;

	rxbuffer->dma_addr = dma_map_single(priv->device, rxbuffer->skb->data,
						len,
						DMA_FROM_DEVICE);

	if (dma_mapping_error(priv->device, rxbuffer->dma_addr)) {
		netdev_err(priv->dev, "%s: DMA mapping error\n", __func__);
		dev_kfree_skb_any(rxbuffer->skb);
		return -EINVAL;
	}
	rxbuffer->dma_addr &= (dma_addr_t)~3;
	rxbuffer->len = len;
	return 0;
}
Зачем они избавились от 2 нижних бит в адресе rxbuffer->dma_addr? В устройство затем пойдет именно rxbuffer->dma_addr. а по приему длину сократят на 2 pktlength -= 2; Для выравнивания нагрузки ( DMA trasfer from TSE starts with 2 aditional bytes for IP payload alignment. ) Код драйвера конечно завязан на проект под fpga, и у меня pci устройство с fpga вместо sopc. Код работает под платформу arm (32 бита), а на машине amd64 по dma приходит пакет который впереди содержит 2 нуля что то адресацией, может кто в курсе куда копать подскажите ? (в проекте ПЛИС имеется добавление этих нулей. Почему они игнорируются под arm) Используется msgdma.


Зачем они избавились от 2 нижних бит в адресе rxbuffer->dma_addr?

там ширина шины данных 32 бит, поэтому такое выравнивание.

это поведение:

DMA trasfer from TSE starts with 2 aditional bytes for IP payload alignment.

настраивается в самой корке TSE.

Остальное не распарсил

registrant ★★★★★
()
Ответ на: комментарий от anonymous

Я так понимаю, выровнена будет именно IP-часть. А я имел в виду, что выравнивается буфер под DMA-транзакции. Тогда, чтобы было еще и по IP выравнивание, добавляется пара нулей в начале.

registrant ★★★★★
()
Ответ на: комментарий от registrant

Считаю такую операцию не безопасной, т. к. система выделяет память, а мы берем вычитаем из адреса 2 и используем, а если, кто то еще будет использовать память до нашего адреса вплотную, то кирдык системе. И от скольки бит надо избавиться в 64 битной системе ? Чет не так.

ri_mik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.