xref: /openbmc/linux/drivers/dma/ti/k3-udma-private.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1d7024191SGrygorii Strashko // SPDX-License-Identifier: GPL-2.0
2d7024191SGrygorii Strashko /*
3d7024191SGrygorii Strashko  *  Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
4d7024191SGrygorii Strashko  *  Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
5d7024191SGrygorii Strashko  */
6*897500c7SRob Herring #include <linux/of.h>
7*897500c7SRob Herring #include <linux/of_platform.h>
8d7024191SGrygorii Strashko 
xudma_navss_psil_pair(struct udma_dev * ud,u32 src_thread,u32 dst_thread)9d7024191SGrygorii Strashko int xudma_navss_psil_pair(struct udma_dev *ud, u32 src_thread, u32 dst_thread)
10d7024191SGrygorii Strashko {
11d7024191SGrygorii Strashko 	return navss_psil_pair(ud, src_thread, dst_thread);
12d7024191SGrygorii Strashko }
13d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_navss_psil_pair);
14d7024191SGrygorii Strashko 
xudma_navss_psil_unpair(struct udma_dev * ud,u32 src_thread,u32 dst_thread)15d7024191SGrygorii Strashko int xudma_navss_psil_unpair(struct udma_dev *ud, u32 src_thread, u32 dst_thread)
16d7024191SGrygorii Strashko {
17d7024191SGrygorii Strashko 	return navss_psil_unpair(ud, src_thread, dst_thread);
18d7024191SGrygorii Strashko }
19d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_navss_psil_unpair);
20d7024191SGrygorii Strashko 
of_xudma_dev_get(struct device_node * np,const char * property)21d7024191SGrygorii Strashko struct udma_dev *of_xudma_dev_get(struct device_node *np, const char *property)
22d7024191SGrygorii Strashko {
23d7024191SGrygorii Strashko 	struct device_node *udma_node = np;
24d7024191SGrygorii Strashko 	struct platform_device *pdev;
25d7024191SGrygorii Strashko 	struct udma_dev *ud;
26d7024191SGrygorii Strashko 
27d7024191SGrygorii Strashko 	if (property) {
28d7024191SGrygorii Strashko 		udma_node = of_parse_phandle(np, property, 0);
29d7024191SGrygorii Strashko 		if (!udma_node) {
30d7024191SGrygorii Strashko 			pr_err("UDMA node is not found\n");
31d7024191SGrygorii Strashko 			return ERR_PTR(-ENODEV);
32d7024191SGrygorii Strashko 		}
33d7024191SGrygorii Strashko 	}
34d7024191SGrygorii Strashko 
35d7024191SGrygorii Strashko 	pdev = of_find_device_by_node(udma_node);
36f9fdb0b8SLiang He 	if (np != udma_node)
37f9fdb0b8SLiang He 		of_node_put(udma_node);
38f9fdb0b8SLiang He 
39d7024191SGrygorii Strashko 	if (!pdev) {
40d7024191SGrygorii Strashko 		pr_debug("UDMA device not found\n");
41d7024191SGrygorii Strashko 		return ERR_PTR(-EPROBE_DEFER);
42d7024191SGrygorii Strashko 	}
43d7024191SGrygorii Strashko 
44d7024191SGrygorii Strashko 	ud = platform_get_drvdata(pdev);
45d7024191SGrygorii Strashko 	if (!ud) {
46d7024191SGrygorii Strashko 		pr_debug("UDMA has not been probed\n");
471438cde8SYu Kuai 		put_device(&pdev->dev);
48d7024191SGrygorii Strashko 		return ERR_PTR(-EPROBE_DEFER);
49d7024191SGrygorii Strashko 	}
50d7024191SGrygorii Strashko 
51d7024191SGrygorii Strashko 	return ud;
52d7024191SGrygorii Strashko }
53d7024191SGrygorii Strashko EXPORT_SYMBOL(of_xudma_dev_get);
54d7024191SGrygorii Strashko 
xudma_get_device(struct udma_dev * ud)55426506a7SPeter Ujfalusi struct device *xudma_get_device(struct udma_dev *ud)
56426506a7SPeter Ujfalusi {
57426506a7SPeter Ujfalusi 	return ud->dev;
58426506a7SPeter Ujfalusi }
59426506a7SPeter Ujfalusi EXPORT_SYMBOL(xudma_get_device);
60426506a7SPeter Ujfalusi 
xudma_get_ringacc(struct udma_dev * ud)61aa8a4c4eSPeter Ujfalusi struct k3_ringacc *xudma_get_ringacc(struct udma_dev *ud)
62aa8a4c4eSPeter Ujfalusi {
63aa8a4c4eSPeter Ujfalusi 	return ud->ringacc;
64aa8a4c4eSPeter Ujfalusi }
65aa8a4c4eSPeter Ujfalusi EXPORT_SYMBOL(xudma_get_ringacc);
66aa8a4c4eSPeter Ujfalusi 
xudma_dev_get_psil_base(struct udma_dev * ud)67d7024191SGrygorii Strashko u32 xudma_dev_get_psil_base(struct udma_dev *ud)
68d7024191SGrygorii Strashko {
69d7024191SGrygorii Strashko 	return ud->psil_base;
70d7024191SGrygorii Strashko }
71d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_dev_get_psil_base);
72d7024191SGrygorii Strashko 
xudma_dev_get_tisci_rm(struct udma_dev * ud)73d7024191SGrygorii Strashko struct udma_tisci_rm *xudma_dev_get_tisci_rm(struct udma_dev *ud)
74d7024191SGrygorii Strashko {
75d7024191SGrygorii Strashko 	return &ud->tisci_rm;
76d7024191SGrygorii Strashko }
77d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_dev_get_tisci_rm);
78d7024191SGrygorii Strashko 
xudma_alloc_gp_rflow_range(struct udma_dev * ud,int from,int cnt)79d7024191SGrygorii Strashko int xudma_alloc_gp_rflow_range(struct udma_dev *ud, int from, int cnt)
80d7024191SGrygorii Strashko {
81d7024191SGrygorii Strashko 	return __udma_alloc_gp_rflow_range(ud, from, cnt);
82d7024191SGrygorii Strashko }
83d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_alloc_gp_rflow_range);
84d7024191SGrygorii Strashko 
xudma_free_gp_rflow_range(struct udma_dev * ud,int from,int cnt)85d7024191SGrygorii Strashko int xudma_free_gp_rflow_range(struct udma_dev *ud, int from, int cnt)
86d7024191SGrygorii Strashko {
87d7024191SGrygorii Strashko 	return __udma_free_gp_rflow_range(ud, from, cnt);
88d7024191SGrygorii Strashko }
89d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_free_gp_rflow_range);
90d7024191SGrygorii Strashko 
xudma_rflow_is_gp(struct udma_dev * ud,int id)91d7024191SGrygorii Strashko bool xudma_rflow_is_gp(struct udma_dev *ud, int id)
92d7024191SGrygorii Strashko {
93d2abc982SPeter Ujfalusi 	if (!ud->rflow_gp_map)
94d2abc982SPeter Ujfalusi 		return false;
95d2abc982SPeter Ujfalusi 
96d7024191SGrygorii Strashko 	return !test_bit(id, ud->rflow_gp_map);
97d7024191SGrygorii Strashko }
98d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_rflow_is_gp);
99d7024191SGrygorii Strashko 
100d7024191SGrygorii Strashko #define XUDMA_GET_PUT_RESOURCE(res)					\
101d7024191SGrygorii Strashko struct udma_##res *xudma_##res##_get(struct udma_dev *ud, int id)	\
102d7024191SGrygorii Strashko {									\
10376866411SArnd Bergmann 	return __udma_reserve_##res(ud, UDMA_TP_NORMAL, id);		\
104d7024191SGrygorii Strashko }									\
105d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_##res##_get);					\
106d7024191SGrygorii Strashko 									\
107d7024191SGrygorii Strashko void xudma_##res##_put(struct udma_dev *ud, struct udma_##res *p)	\
108d7024191SGrygorii Strashko {									\
109d7024191SGrygorii Strashko 	clear_bit(p->id, ud->res##_map);				\
110d7024191SGrygorii Strashko }									\
111d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_##res##_put)
112d7024191SGrygorii Strashko XUDMA_GET_PUT_RESOURCE(tchan);
113d7024191SGrygorii Strashko XUDMA_GET_PUT_RESOURCE(rchan);
114d7024191SGrygorii Strashko 
xudma_rflow_get(struct udma_dev * ud,int id)115d7024191SGrygorii Strashko struct udma_rflow *xudma_rflow_get(struct udma_dev *ud, int id)
116d7024191SGrygorii Strashko {
117d7024191SGrygorii Strashko 	return __udma_get_rflow(ud, id);
118d7024191SGrygorii Strashko }
119d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_rflow_get);
120d7024191SGrygorii Strashko 
xudma_rflow_put(struct udma_dev * ud,struct udma_rflow * p)121d7024191SGrygorii Strashko void xudma_rflow_put(struct udma_dev *ud, struct udma_rflow *p)
122d7024191SGrygorii Strashko {
123d7024191SGrygorii Strashko 	__udma_put_rflow(ud, p);
124d7024191SGrygorii Strashko }
125d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_rflow_put);
126d7024191SGrygorii Strashko 
xudma_get_rflow_ring_offset(struct udma_dev * ud)127d2abc982SPeter Ujfalusi int xudma_get_rflow_ring_offset(struct udma_dev *ud)
128d2abc982SPeter Ujfalusi {
129d2abc982SPeter Ujfalusi 	return ud->tflow_cnt;
130d2abc982SPeter Ujfalusi }
131d2abc982SPeter Ujfalusi EXPORT_SYMBOL(xudma_get_rflow_ring_offset);
132d2abc982SPeter Ujfalusi 
133d7024191SGrygorii Strashko #define XUDMA_GET_RESOURCE_ID(res)					\
134d7024191SGrygorii Strashko int xudma_##res##_get_id(struct udma_##res *p)				\
135d7024191SGrygorii Strashko {									\
136d7024191SGrygorii Strashko 	return p->id;							\
137d7024191SGrygorii Strashko }									\
138d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_##res##_get_id)
139d7024191SGrygorii Strashko XUDMA_GET_RESOURCE_ID(tchan);
140d7024191SGrygorii Strashko XUDMA_GET_RESOURCE_ID(rchan);
141d7024191SGrygorii Strashko XUDMA_GET_RESOURCE_ID(rflow);
142d7024191SGrygorii Strashko 
143d7024191SGrygorii Strashko /* Exported register access functions */
144d7024191SGrygorii Strashko #define XUDMA_RT_IO_FUNCTIONS(res)					\
145d7024191SGrygorii Strashko u32 xudma_##res##rt_read(struct udma_##res *p, int reg)			\
146d7024191SGrygorii Strashko {									\
14767414f8dSPeter Ujfalusi 	if (!p)								\
14867414f8dSPeter Ujfalusi 		return 0;						\
14967414f8dSPeter Ujfalusi 	return udma_read(p->reg_rt, reg);				\
150d7024191SGrygorii Strashko }									\
151d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_##res##rt_read);					\
152d7024191SGrygorii Strashko 									\
153d7024191SGrygorii Strashko void xudma_##res##rt_write(struct udma_##res *p, int reg, u32 val)	\
154d7024191SGrygorii Strashko {									\
15567414f8dSPeter Ujfalusi 	if (!p)								\
15667414f8dSPeter Ujfalusi 		return;							\
15767414f8dSPeter Ujfalusi 	udma_write(p->reg_rt, reg, val);				\
158d7024191SGrygorii Strashko }									\
159d7024191SGrygorii Strashko EXPORT_SYMBOL(xudma_##res##rt_write)
160d7024191SGrygorii Strashko XUDMA_RT_IO_FUNCTIONS(tchan);
161d7024191SGrygorii Strashko XUDMA_RT_IO_FUNCTIONS(rchan);
1625b65781dSVignesh Raghavendra 
xudma_is_pktdma(struct udma_dev * ud)1635b65781dSVignesh Raghavendra int xudma_is_pktdma(struct udma_dev *ud)
1645b65781dSVignesh Raghavendra {
1655b65781dSVignesh Raghavendra 	return ud->match_data->type == DMA_TYPE_PKTDMA;
1665b65781dSVignesh Raghavendra }
1675b65781dSVignesh Raghavendra EXPORT_SYMBOL(xudma_is_pktdma);
1685b65781dSVignesh Raghavendra 
xudma_pktdma_tflow_get_irq(struct udma_dev * ud,int udma_tflow_id)1695b65781dSVignesh Raghavendra int xudma_pktdma_tflow_get_irq(struct udma_dev *ud, int udma_tflow_id)
1705b65781dSVignesh Raghavendra {
1715b65781dSVignesh Raghavendra 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
1725b65781dSVignesh Raghavendra 
17389e0032eSThomas Gleixner 	return msi_get_virq(ud->dev, udma_tflow_id + oes->pktdma_tchan_flow);
1745b65781dSVignesh Raghavendra }
1755b65781dSVignesh Raghavendra EXPORT_SYMBOL(xudma_pktdma_tflow_get_irq);
1765b65781dSVignesh Raghavendra 
xudma_pktdma_rflow_get_irq(struct udma_dev * ud,int udma_rflow_id)1775b65781dSVignesh Raghavendra int xudma_pktdma_rflow_get_irq(struct udma_dev *ud, int udma_rflow_id)
1785b65781dSVignesh Raghavendra {
1795b65781dSVignesh Raghavendra 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
1805b65781dSVignesh Raghavendra 
18189e0032eSThomas Gleixner 	return msi_get_virq(ud->dev, udma_rflow_id + oes->pktdma_rchan_flow);
1825b65781dSVignesh Raghavendra }
1835b65781dSVignesh Raghavendra EXPORT_SYMBOL(xudma_pktdma_rflow_get_irq);
184