mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: Sascha Hauer <s.hauer@pengutronix.de>,
	BAREBOX <barebox@lists.infradead.org>
Subject: Re: [PATCH v2 18/33] dma: ti: k3-udma-am62l: Add AM62L support DMA drivers
Date: Mon, 16 Jun 2025 13:57:48 +0200	[thread overview]
Message-ID: <306265bc-0506-48c0-8a15-2f5019f69092@pengutronix.de> (raw)
In-Reply-To: <20250605-arm-k3-am62l-v2-18-53257d4b2dd2@pengutronix.de>

Hello Sascha,

On 6/5/25 14:42, Sascha Hauer wrote:
> +	switch (uc->config.dir) {
> +	case DMA_MEM_TO_MEM:

Tangential question. Could we implement arbitrary memory read/write on
top of this without further changes to the driver?

Having a /dev/dma device or similar with the same API as /dev/mem would
be useful to test isolation of OP-TEE.

Cheers,
Ahmad

> +		/* Non synchronized - mem to mem type of transfer */
> +		dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-MEM\n", __func__,
> +			uc->id);
> +
> +		ret = bcdma_alloc_bchan_resources(uc);
> +		if (ret)
> +			return ret;
> +
> +		break;
> +	default:
> +		/* Can not happen */
> +		dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n",
> +			__func__, uc->id, uc->config.dir);
> +		return -EINVAL;
> +	}
> +
> +	/* check if the channel configuration was successful */
> +	if (ret)
> +		goto err_res_free;
> +
> +	if (udma_is_chan_running(uc)) {
> +		dev_warn(uc->ud->dev, "chan%d: is running!\n", uc->id);
> +		udma_stop(uc);
> +		if (udma_is_chan_running(uc)) {
> +			dev_err(uc->ud->dev, "chan%d: won't stop!\n", uc->id);
> +			goto err_res_free;
> +		}
> +	}
> +
> +	udma_reset_rings(uc);
> +
> +	return 0;
> +
> +err_res_free:
> +	bcdma_free_bchan_resources(uc);
> +	udma_free_tx_resources(uc);
> +	udma_free_rx_resources(uc);
> +
> +	udma_reset_uchan(uc);
> +
> +	return ret;
> +}
> +
> +static int pktdma_v2_alloc_chan_resources(struct udma_chan *uc)
> +{
> +	struct udma_dev *ud = uc->ud;
> +	int ret;
> +
> +	switch (uc->config.dir) {
> +	case DMA_MEM_TO_DEV:
> +		/* Slave transfer synchronized - mem to dev (TX) trasnfer */
> +		dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-DEV\n", __func__,
> +			uc->id);
> +
> +		ret = udma_alloc_tx_resources(uc);
> +		if (ret) {
> +			uc->config.remote_thread_id = -1;
> +			return ret;
> +		}
> +		break;
> +	case DMA_DEV_TO_MEM:
> +		/* Slave transfer synchronized - dev to mem (RX) trasnfer */
> +		dev_dbg(uc->ud->dev, "%s: chan%d as DEV-to-MEM\n", __func__,
> +			uc->id);
> +
> +		ret = udma_alloc_rx_resources(uc);
> +		if (ret) {
> +			uc->config.remote_thread_id = -1;
> +			return ret;
> +		}
> +
> +		ret = pktdma_v2_rx_channel_config(uc);
> +		break;
> +	default:
> +		/* Can not happen */
> +		dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n",
> +			__func__, uc->id, uc->config.dir);
> +		return -EINVAL;
> +	}
> +
> +	/* check if the channel configuration was successful */
> +	if (ret)
> +		goto err_res_free;
> +
> +	if (uc->config.dir == DMA_DEV_TO_MEM)
> +		udma_rchanrt_update_bits(uc->rchan, UDMA_RCHAN_RT_CTL_REG,
> +					 UDMA_CHAN_RT_CTL_TDOWN | UDMA_CHAN_RT_CTL_AUTOPAIR,
> +					 UDMA_CHAN_RT_CTL_AUTOPAIR);
> +	else if (uc->config.dir == DMA_MEM_TO_DEV)
> +		udma_tchanrt_update_bits(uc->tchan, UDMA_TCHAN_RT_CTL_REG,
> +					 UDMA_CHAN_RT_CTL_TDOWN | UDMA_CHAN_RT_CTL_AUTOPAIR,
> +					 UDMA_CHAN_RT_CTL_AUTOPAIR);
> +
> +	if (udma_is_chan_running(uc)) {
> +		dev_warn(ud->dev, "chan%d: is running!\n", uc->id);
> +		udma_stop(uc);
> +		if (udma_is_chan_running(uc)) {
> +			dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
> +			goto err_res_free;
> +		}
> +	}
> +
> +	if (uc->tchan)
> +		dev_dbg(ud->dev,
> +			"chan%d: tchan%d, tflow%d, Remote thread: 0x%04x\n",
> +			uc->id, uc->tchan->id, uc->tchan->tflow_id,
> +			uc->config.remote_thread_id);
> +	else if (uc->rchan)
> +		dev_dbg(ud->dev,
> +			"chan%d: rchan%d, rflow%d, Remote thread: 0x%04x\n",
> +			uc->id, uc->rchan->id, uc->rflow->id,
> +			uc->config.remote_thread_id);
> +	return 0;
> +
> +err_res_free:
> +	udma_free_tx_resources(uc);
> +	udma_free_rx_resources(uc);
> +
> +	udma_reset_uchan(uc);
> +
> +	return ret;
> +}
> +
> +static int am62l_udma_request(struct dma *dma)
> +{
> +	struct udma_dev *ud = dev_get_priv(dma->dev);
> +	struct udma_chan_config *ucc;
> +	struct udma_chan *uc;
> +	int ret;
> +
> +	if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
> +		dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
> +		return -EINVAL;
> +	}
> +
> +	uc = &ud->channels[dma->id];
> +	ucc = &uc->config;
> +	switch (ud->match_data->type) {
> +	case DMA_TYPE_BCDMA_V2:
> +		ret = bcdma_v2_alloc_chan_resources(uc);
> +		break;
> +	case DMA_TYPE_PKTDMA_V2:
> +		ret = pktdma_v2_alloc_chan_resources(uc);
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +	if (ret) {
> +		dev_err(dma->dev, "alloc dma res failed %d\n", ret);
> +		return -EINVAL;
> +	}
> +
> +	if (uc->config.dir == DMA_MEM_TO_DEV) {
> +		uc->desc_tx = dma_alloc_coherent(DMA_DEVICE_BROKEN, ucc->hdesc_size, DMA_ADDRESS_BROKEN);
> +	} else {
> +		uc->desc_rx = dma_alloc_coherent(DMA_DEVICE_BROKEN,
> +						 ucc->hdesc_size * UDMA_RX_DESC_NUM, DMA_ADDRESS_BROKEN);
> +	}
> +
> +	uc->in_use = true;
> +	uc->desc_rx_cur = 0;
> +	uc->num_rx_bufs = 0;
> +
> +	if (uc->config.dir == DMA_DEV_TO_MEM) {
> +		uc->cfg_data.flow_id_base = uc->rflow->id;
> +		uc->cfg_data.flow_id_cnt = 1;
> +	}
> +
> +	return 0;
> +}
> +
> +static int bcdma_v2_setup_resources(struct udma_dev *ud)
> +{
> +	struct device *dev = ud->dev;
> +	size_t desc_size;
> +
> +	ud->bchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->bchan_cnt),
> +					   sizeof(unsigned long), GFP_KERNEL);
> +	ud->bchans = devm_kcalloc(dev, ud->bchan_cnt, sizeof(*ud->bchans),
> +				  GFP_KERNEL);
> +	ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt),
> +					   sizeof(unsigned long), GFP_KERNEL);
> +	ud->tchans = devm_kcalloc(dev, ud->tchan_cnt, sizeof(*ud->tchans),
> +				  GFP_KERNEL);
> +	ud->rchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rchan_cnt),
> +					   sizeof(unsigned long), GFP_KERNEL);
> +	ud->rchans = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rchans),
> +				  GFP_KERNEL);
> +	ud->rflows = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rflows),
> +				  GFP_KERNEL);
> +
> +	desc_size = cppi5_trdesc_calc_size(K3_UDMA_MAX_TR,
> +					   sizeof(struct cppi5_tr_type15_t));
> +	ud->bc_desc = devm_kzalloc(dev, ALIGN(desc_size, ARCH_DMA_MINALIGN), GFP_KERNEL);
> +
> +	if (!ud->bchan_map || !ud->tchan_map || !ud->rchan_map ||
> +	    !ud->bchans || !ud->tchans || !ud->rchans ||
> +	    !ud->rflows || !ud->bc_desc)
> +		return -ENOMEM;
> +
> +	bitmap_zero(ud->bchan_map, ud->bchan_cnt);
> +	bitmap_zero(ud->tchan_map, ud->tchan_cnt);
> +	bitmap_zero(ud->rchan_map, ud->rchan_cnt);
> +
> +	return 0;
> +}
> +
> +static int pktdma_v2_setup_resources(struct udma_dev *ud)
> +{
> +	struct device *dev = ud->dev;
> +
> +	ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt),
> +					   sizeof(unsigned long), GFP_KERNEL);
> +	ud->tchans = devm_kcalloc(dev, ud->tchan_cnt, sizeof(*ud->tchans),
> +				  GFP_KERNEL);
> +	ud->rchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rchan_cnt),
> +					   sizeof(unsigned long), GFP_KERNEL);
> +	ud->rchans = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rchans),
> +				  GFP_KERNEL);
> +	ud->rflow_map = devm_kcalloc(dev, BITS_TO_LONGS(ud->rflow_cnt),
> +				     sizeof(unsigned long),
> +				     GFP_KERNEL);
> +	ud->rflows = devm_kcalloc(dev, ud->rflow_cnt, sizeof(*ud->rflows),
> +				  GFP_KERNEL);
> +	ud->tflow_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tflow_cnt),
> +					   sizeof(unsigned long), GFP_KERNEL);
> +
> +	if (!ud->tchan_map || !ud->rchan_map || !ud->tflow_map || !ud->tchans ||
> +	    !ud->rchans || !ud->rflows || !ud->rflow_map)
> +		return -ENOMEM;
> +
> +	bitmap_zero(ud->bchan_map, ud->bchan_cnt);
> +	bitmap_zero(ud->tchan_map, ud->tchan_cnt);
> +	bitmap_zero(ud->rchan_map, ud->rchan_cnt);
> +
> +	return 0;
> +}
> +
> +static int am62l_udma_setup_resources(struct udma_dev *ud)
> +{
> +	struct device *dev = ud->dev;
> +	int ch_count, ret;
> +
> +	switch (ud->match_data->type) {
> +	case DMA_TYPE_BCDMA_V2:
> +		ret = bcdma_v2_setup_resources(ud);
> +		break;
> +	case DMA_TYPE_PKTDMA_V2:
> +		ret = pktdma_v2_setup_resources(ud);
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	if (ret)
> +		return ret;
> +
> +	ch_count = ud->bchan_cnt + ud->tchan_cnt + ud->rchan_cnt;
> +
> +	ud->channels = devm_kcalloc(dev, ch_count, sizeof(*ud->channels),
> +				    GFP_KERNEL);
> +	if (!ud->channels)
> +		return -ENOMEM;
> +
> +	switch (ud->match_data->type) {
> +	case DMA_TYPE_UDMA:
> +		dev_dbg(dev,
> +			"Channels: %d (tchan: %u, rchan: %u, gp-rflow: %u)\n",
> +			ch_count, ud->tchan_cnt, ud->rchan_cnt, ud->rflow_cnt);
> +		break;
> +	case DMA_TYPE_BCDMA:
> +	case DMA_TYPE_BCDMA_V2:
> +		dev_dbg(dev,
> +			"Channels: %d (bchan: %u, tchan: %u, rchan: %u)\n",
> +			ch_count, ud->bchan_cnt, ud->tchan_cnt, ud->rchan_cnt);
> +		break;
> +	case DMA_TYPE_PKTDMA_V2:
> +		dev_dbg(dev,
> +			"Channels: %d (tchan: %u, rchan: %u)\n",
> +			ch_count, ud->tchan_cnt, ud->rchan_cnt);
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return ch_count;
> +}
> +
> +static int am62l_udma_get_mmrs(struct device *dev, struct udma_dev *ud)
> +{
> +	int i;
> +
> +	/* There are no tchan and rchan in BCDMA_V2 and PKTDMA_V2.
> +	 * Duplicate chan as tchan and rchan to keep the common code
> +	 * in k3-udma-common.c functional.
> +	 */
> +	if (ud->match_data->type == DMA_TYPE_BCDMA_V2) {
> +		ud->bchan_cnt = ud->match_data->bchan_cnt;
> +		ud->chan_cnt = ud->match_data->chan_cnt;
> +		ud->tchan_cnt = ud->match_data->chan_cnt;
> +		ud->rchan_cnt = ud->match_data->chan_cnt;
> +		ud->rflow_cnt = ud->chan_cnt;
> +	} else if (ud->match_data->type == DMA_TYPE_PKTDMA_V2) {
> +		ud->chan_cnt = ud->match_data->chan_cnt;
> +		ud->tchan_cnt = ud->match_data->tchan_cnt;
> +		ud->rchan_cnt = ud->match_data->rchan_cnt;
> +		ud->rflow_cnt = ud->match_data->rflow_cnt;
> +	}
> +
> +	for (i = 1; i < AM62L_MMR_LAST; i++) {
> +		if (i == AM62L_MMR_BCHANRT && ud->bchan_cnt == 0)
> +			continue;
> +		if (i == AM62L_MMR_CHANRT && ud->chan_cnt == 0)
> +			continue;
> +
> +		ud->mmrs[i] = dev_request_mem_region_by_name(ud->dev, am62l_mmr_names[i]);
> +		if (IS_ERR(ud->mmrs[i]))
> +			return PTR_ERR(ud->mmrs[i]);
> +	}
> +
> +	return 0;
> +}
> +
> +static int am62l_udma_rfree(struct dma *dma)
> +{
> +	struct udma_dev *ud = dev_get_priv(dma->dev);
> +	struct udma_chan *uc;
> +
> +	if (dma->id >= (ud->rchan_cnt + ud->tchan_cnt)) {
> +		dev_err(dma->dev, "invalid dma ch_id %lu\n", dma->id);
> +		return -EINVAL;
> +	}
> +	uc = &ud->channels[dma->id];
> +
> +	if (udma_is_chan_running(uc))
> +		udma_stop(uc);
> +
> +	bcdma_free_bchan_resources(uc);
> +	udma_free_tx_resources(uc);
> +	udma_free_rx_resources(uc);
> +	udma_reset_uchan(uc);
> +
> +	uc->in_use = false;
> +
> +	return 0;
> +}
> +
> +static const struct dma_ops am62l_udma_ops = {
> +	.transfer	= udma_transfer,
> +	.of_xlate	= udma_of_xlate,
> +	.request	= am62l_udma_request,
> +	.rfree		= am62l_udma_rfree,
> +	.enable		= udma_enable,
> +	.disable	= udma_disable,
> +	.send		= udma_send,
> +	.receive	= udma_receive,
> +	.prepare_rcv_buf = udma_prepare_rcv_buf,
> +	.get_cfg	= udma_get_cfg,
> +};
> +
> +static int k3_udma_am62l_probe(struct device *dev)
> +{
> +	struct udma_dev *ud;
> +	struct udma_chan *uc;
> +	int i, ret;
> +	struct k3_ringacc_init_data ring_init_data = { 0 };
> +	const struct udma_match_data *match_data;
> +	struct dma_device *dmad;
> +
> +	match_data = device_get_match_data(dev);
> +
> +	ud = xzalloc(sizeof(*ud));
> +	ud->match_data = match_data;
> +	ud->dev = dev;
> +
> +	dev->priv = ud;
> +
> +	ret = am62l_udma_get_mmrs(dev, ud);
> +	if (ret)
> +		return ret;
> +
> +	if (ud->match_data->type == DMA_TYPE_BCDMA_V2)
> +		ring_init_data.num_rings = ud->bchan_cnt + ud->chan_cnt;
> +	else if (ud->match_data->type == DMA_TYPE_PKTDMA_V2)
> +		ring_init_data.num_rings = ud->rflow_cnt;
> +
> +	ring_init_data.base_rt = ud->mmrs[AM62L_MMR_RFLOWRT];
> +
> +	ud->ringacc = k3_ringacc_dmarings_init(dev, &ring_init_data);
> +	if (IS_ERR(ud->ringacc))
> +		return PTR_ERR(ud->ringacc);
> +
> +	ret = am62l_udma_setup_resources(ud);
> +	if (ret < 0)
> +		return ret;
> +
> +	ud->ch_count = ret;
> +
> +	for (i = 0; i < ud->bchan_cnt; i++) {
> +		struct udma_bchan *bchan = &ud->bchans[i];
> +
> +		bchan->id = i;
> +		bchan->reg_rt = ud->mmrs[AM62L_MMR_BCHANRT] + i * 0x1000;
> +	}
> +
> +	for (i = 0; i < ud->tchan_cnt; i++) {
> +		struct udma_tchan *tchan = &ud->tchans[i];
> +
> +		tchan->id = i;
> +		tchan->reg_rt = ud->mmrs[AM62L_MMR_CHANRT] + UDMA_CH_1000(i);
> +		tchan->reg_chan = tchan->reg_rt + 0x4;
> +	}
> +
> +	for (i = 0; i < ud->rchan_cnt; i++) {
> +		struct udma_rchan *rchan = &ud->rchans[i];
> +
> +		rchan->id = i;
> +		rchan->reg_rt = ud->mmrs[AM62L_MMR_CHANRT] + UDMA_CH_1000(i);
> +		rchan->reg_chan = rchan->reg_rt + 0x4;
> +	}
> +
> +	for (i = 0; i < ud->rflow_cnt; i++) {
> +		struct udma_rflow *rflow = &ud->rflows[i];
> +
> +		rflow->id = i;
> +		rflow->reg_rt = ud->mmrs[AM62L_MMR_RFLOWRT] + UDMA_CH_1000(2 * i);
> +		rflow->reg_rflow = rflow->reg_rt;
> +	}
> +
> +	for (i = 0; i < ud->ch_count; i++) {
> +		struct udma_chan *uc = &ud->channels[i];
> +
> +		uc->ud = ud;
> +		uc->id = i;
> +		uc->config.remote_thread_id = -1;
> +		uc->bchan = NULL;
> +		uc->tchan = NULL;
> +		uc->rchan = NULL;
> +		uc->config.mapped_channel_id = -1;
> +		uc->config.default_flow_id = -1;
> +		uc->config.dir = DMA_MEM_TO_MEM;
> +		sprintf(uc->name, "UDMA chan%d\n", i);
> +		if (!i)
> +			uc->in_use = true;
> +	}
> +
> +	uc = &ud->channels[0];
> +	ret = 0;
> +	switch (ud->match_data->type) {
> +	case DMA_TYPE_BCDMA_V2:
> +		ret = bcdma_v2_alloc_chan_resources(uc);
> +		break;
> +	default:
> +		break; /* Do nothing in any other case */
> +	};
> +
> +	if (ret) {
> +		dev_err(dev, " Channel 0 allocation failure %d\n", ret);
> +		return ret;
> +	}
> +
> +	dmad = &ud->dmad;
> +
> +	dmad->dev = dev;
> +	dmad->ops = &am62l_udma_ops;
> +
> +	ret = dma_device_register(dmad);
> +
> +	return ret;
> +}
> +
> +static void am62l_udma_remove(struct device *dev)
> +{
> +	struct udma_dev *ud = dev_get_priv(dev);
> +	struct udma_chan *uc = &ud->channels[0];
> +
> +	switch (ud->match_data->type) {
> +	case DMA_TYPE_BCDMA_V2:
> +		bcdma_free_bchan_resources(uc);
> +		break;
> +	default:
> +		break;
> +	};
> +}
> +
> +static struct udma_match_data am62l_bcdma_data = {
> +	.type = DMA_TYPE_BCDMA_V2,
> +	.psil_base = 0x2000, /* for tchan and rchan, not applicable to bchan */
> +	.enable_memcpy_support = true, /* Supported via bchan */
> +	.flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST | UDMA_FLAG_TDTYPE,
> +	.statictr_z_mask = GENMASK(23, 0),
> +	.bchan_cnt = 16,
> +	.chan_cnt = 128,
> +	.tchan_cnt = 128,
> +	.rchan_cnt = 128,
> +};
> +
> +static struct udma_match_data am62l_pktdma_data = {
> +	.type = DMA_TYPE_PKTDMA_V2,
> +	.psil_base = 0x1000,
> +	.enable_memcpy_support = false,
> +	.flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST | UDMA_FLAG_TDTYPE,
> +	.statictr_z_mask = GENMASK(23, 0),
> +	.tchan_cnt = 97,
> +	.rchan_cnt = 97,
> +	.chan_cnt = 97,
> +	.tflow_cnt = 112,
> +	.rflow_cnt = 112,
> +};
> +
> +static struct of_device_id k3_udma_am62l_dt_ids[] = {
> +	{
> +		.compatible = "ti,am62l-dmss-bcdma",
> +		.data = &am62l_bcdma_data,
> +	}, {
> +		.compatible = "ti,am62l-dmss-pktdma",
> +		.data = &am62l_pktdma_data,
> +	}, {
> +		/* Sentinel */
> +	},
> +};
> +
> +static struct driver k3_udma_am62l_driver = {
> +	.probe  = k3_udma_am62l_probe,
> +	.remove = am62l_udma_remove,
> +	.name   = "k3-udma-am62l",
> +	.of_compatible = k3_udma_am62l_dt_ids,
> +};
> +
> +core_platform_driver(k3_udma_am62l_driver);
> diff --git a/drivers/dma/ti/k3-udma.h b/drivers/dma/ti/k3-udma.h
> index 88325160841886af5514ae2385400e2b4156bb07..0abbb478ddb4d999cfdfc317924c4a9f2116a11d 100644
> --- a/drivers/dma/ti/k3-udma.h
> +++ b/drivers/dma/ti/k3-udma.h
> @@ -143,6 +143,7 @@ struct udma_dev {
>  	int rchan_cnt;
>  	int rflow_cnt;
>  	int tflow_cnt;
> +	int chan_cnt;
>  	unsigned long *bchan_map;
>  	unsigned long *tchan_map;
>  	unsigned long *rchan_map;
> @@ -156,6 +157,7 @@ struct udma_dev {
>  	struct udma_rflow *rflows;
>  
>  	const struct udma_match_data *match_data;
> +	void *bc_desc;
>  
>  	struct udma_chan *channels;
>  	u32 psil_base;
> 

-- 
Pengutronix e.K.                  |                             |
Steuerwalder Str. 21              | http://www.pengutronix.de/  |
31137 Hildesheim, Germany         | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686  | Fax:   +49-5121-206917-5555 |




  reply	other threads:[~2025-06-16 12:58 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-05 12:42 [PATCH v2 00/33] ARM: K3: add support for AM62L Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 01/33] scripts/k3img: make more flexible Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 02/33] images: K3: rename %.k3img target to %.k3_am62x_img Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 03/33] ARM: K3: prepare support for other SoCs Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 04/33] ARM: dts: add k3-am62l dts(i) files Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 05/33] ARM: dts: am62l: Fix assigned-clock-parents Sascha Hauer
2025-06-16 11:41   ` Ahmad Fatoum
2025-06-17  9:10     ` Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 06/33] ARM: K3: add am62lx base support Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 07/33] ARM: Makefile: descend into mach-* for cleaning Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 08/33] ARM: k3: rename yaml files from am625 to am62x Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 09/33] firmware: add ti-linux-firmware submodule Sascha Hauer
2025-06-16 11:54   ` Ahmad Fatoum
2025-06-05 12:42 ` [PATCH v2 10/33] scripts/ti-board-config.py: fix length Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 11/33] ARM: k3: add yaml files for AM62l Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 12/33] k3: ringacc: pass ringrt address in struct k3_ringacc_init_data Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 13/33] drivers: soc: ti: k3-ringacc: handle absence of tisci Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 14/33] drivers: soc: ti: k3-ringacc: fix k3_ringacc_ring_reset_sci Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 15/33] dma: ti: k3-psil: Add PSIL data for AM62L Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 16/33] dma: ti: k3-udma: Refactor common bits for AM62L support Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 17/33] dma: ti: k3-udma-common: Update common code for AM62L DMAs Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 18/33] dma: ti: k3-udma-am62l: Add AM62L support DMA drivers Sascha Hauer
2025-06-16 11:57   ` Ahmad Fatoum [this message]
2025-06-17  8:20     ` Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 19/33] ARM: dts: am62l: Add ethernet ports Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 20/33] ARM: dts: am62l evm: " Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 21/33] ARM: k3: am62l: add barebox specific am62l.dtsi Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 22/33] net: davinci_mdio: Use fallback clock rate Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 23/33] firmware: arm_scmi: Add support for clock parents Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 24/33] clk: add struct clk_parent_data Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 25/33] clk: arm_scmi: implement clock parent setting Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 26/33] ARM: dts: am62l3-evm: add MMC aliases Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 27/33] dma: ti: k3-udma: limit asel to am625 Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 28/33] gpio: increase ARCH_NR_GPIOS to 512 Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 29/33] ARM: dts: k3-am62l: reserve memory for TF-A and OP-TEE Sascha Hauer
2025-06-16 12:01   ` Ahmad Fatoum
2025-06-05 12:42 ` [PATCH v2 30/33] ARM: k3: add AM62l3 EVM board support Sascha Hauer
2025-06-16 12:03   ` Ahmad Fatoum
2025-06-17  9:18     ` Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 31/33] ARM: K3: am62l: add serial aliases Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 32/33] Documentation: boards: k3: split generic and am62x specific documentation Sascha Hauer
2025-06-05 12:42 ` [PATCH v2 33/33] Documentation: boards: k3: add AM62lx documentation Sascha Hauer
2025-06-17  6:54 ` [PATCH v2 00/33] ARM: K3: add support for AM62L Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=306265bc-0506-48c0-8a15-2f5019f69092@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=s.hauer@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox