xref: /rk3399_rockchip-uboot/arch/sandbox/lib/pci_io.c (revision b939689c7b87773c44275a578ffc8674a867e39d)
1*9569c406SSimon Glass /*
2*9569c406SSimon Glass  * Copyright (c) 2014 Google, Inc
3*9569c406SSimon Glass  * Written by Simon Glass <sjg@chromium.org>
4*9569c406SSimon Glass  *
5*9569c406SSimon Glass  * SPDX-License-Identifier:     GPL-2.0+
6*9569c406SSimon Glass  */
7*9569c406SSimon Glass 
8*9569c406SSimon Glass /*
9*9569c406SSimon Glass  * IO space access commands.
10*9569c406SSimon Glass  */
11*9569c406SSimon Glass 
12*9569c406SSimon Glass #include <common.h>
13*9569c406SSimon Glass #include <command.h>
14*9569c406SSimon Glass #include <dm.h>
15*9569c406SSimon Glass #include <asm/io.h>
16*9569c406SSimon Glass 
pci_map_physmem(phys_addr_t paddr,unsigned long * lenp,struct udevice ** devp,void ** ptrp)17*9569c406SSimon Glass int pci_map_physmem(phys_addr_t paddr, unsigned long *lenp,
18*9569c406SSimon Glass 		    struct udevice **devp, void **ptrp)
19*9569c406SSimon Glass {
20*9569c406SSimon Glass 	struct udevice *dev;
21*9569c406SSimon Glass 	int ret;
22*9569c406SSimon Glass 
23*9569c406SSimon Glass 	*ptrp = 0;
24*9569c406SSimon Glass 	for (uclass_first_device(UCLASS_PCI_EMUL, &dev);
25*9569c406SSimon Glass 	     dev;
26*9569c406SSimon Glass 	     uclass_next_device(&dev)) {
27*9569c406SSimon Glass 		struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
28*9569c406SSimon Glass 
29*9569c406SSimon Glass 		if (!ops || !ops->map_physmem)
30*9569c406SSimon Glass 			continue;
31*9569c406SSimon Glass 		ret = (ops->map_physmem)(dev, paddr, lenp, ptrp);
32*9569c406SSimon Glass 		if (ret)
33*9569c406SSimon Glass 			continue;
34*9569c406SSimon Glass 		*devp = dev;
35*9569c406SSimon Glass 		return 0;
36*9569c406SSimon Glass 	}
37*9569c406SSimon Glass 
38*9569c406SSimon Glass 	debug("%s: failed: addr=%x\n", __func__, paddr);
39*9569c406SSimon Glass 	return -ENOSYS;
40*9569c406SSimon Glass }
41*9569c406SSimon Glass 
pci_unmap_physmem(const void * vaddr,unsigned long len,struct udevice * dev)42*9569c406SSimon Glass int pci_unmap_physmem(const void *vaddr, unsigned long len,
43*9569c406SSimon Glass 		      struct udevice *dev)
44*9569c406SSimon Glass {
45*9569c406SSimon Glass 	struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
46*9569c406SSimon Glass 
47*9569c406SSimon Glass 	if (!ops || !ops->unmap_physmem)
48*9569c406SSimon Glass 		return -ENOSYS;
49*9569c406SSimon Glass 	return (ops->unmap_physmem)(dev, vaddr, len);
50*9569c406SSimon Glass }
51*9569c406SSimon Glass 
pci_io_read(unsigned int addr,ulong * valuep,pci_size_t size)52*9569c406SSimon Glass static int pci_io_read(unsigned int addr, ulong *valuep, pci_size_t size)
53*9569c406SSimon Glass {
54*9569c406SSimon Glass 	struct udevice *dev;
55*9569c406SSimon Glass 	int ret;
56*9569c406SSimon Glass 
57*9569c406SSimon Glass 	*valuep = pci_get_ff(size);
58*9569c406SSimon Glass 	for (uclass_first_device(UCLASS_PCI_EMUL, &dev);
59*9569c406SSimon Glass 	     dev;
60*9569c406SSimon Glass 	     uclass_next_device(&dev)) {
61*9569c406SSimon Glass 		struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
62*9569c406SSimon Glass 
63*9569c406SSimon Glass 		if (ops && ops->read_io) {
64*9569c406SSimon Glass 			ret = (ops->read_io)(dev, addr, valuep, size);
65*9569c406SSimon Glass 			if (!ret)
66*9569c406SSimon Glass 				return 0;
67*9569c406SSimon Glass 		}
68*9569c406SSimon Glass 	}
69*9569c406SSimon Glass 
70*9569c406SSimon Glass 	debug("%s: failed: addr=%x\n", __func__, addr);
71*9569c406SSimon Glass 	return -ENOSYS;
72*9569c406SSimon Glass }
73*9569c406SSimon Glass 
pci_io_write(unsigned int addr,ulong value,pci_size_t size)74*9569c406SSimon Glass static int pci_io_write(unsigned int addr, ulong value, pci_size_t size)
75*9569c406SSimon Glass {
76*9569c406SSimon Glass 	struct udevice *dev;
77*9569c406SSimon Glass 	int ret;
78*9569c406SSimon Glass 
79*9569c406SSimon Glass 	for (uclass_first_device(UCLASS_PCI_EMUL, &dev);
80*9569c406SSimon Glass 	     dev;
81*9569c406SSimon Glass 	     uclass_next_device(&dev)) {
82*9569c406SSimon Glass 		struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
83*9569c406SSimon Glass 
84*9569c406SSimon Glass 		if (ops && ops->write_io) {
85*9569c406SSimon Glass 			ret = (ops->write_io)(dev, addr, value, size);
86*9569c406SSimon Glass 			if (!ret)
87*9569c406SSimon Glass 				return 0;
88*9569c406SSimon Glass 		}
89*9569c406SSimon Glass 	}
90*9569c406SSimon Glass 
91*9569c406SSimon Glass 	debug("%s: failed: addr=%x, value=%lx\n", __func__, addr, value);
92*9569c406SSimon Glass 	return -ENOSYS;
93*9569c406SSimon Glass }
94*9569c406SSimon Glass 
inl(unsigned int addr)95*9569c406SSimon Glass int inl(unsigned int addr)
96*9569c406SSimon Glass {
97*9569c406SSimon Glass 	unsigned long value;
98*9569c406SSimon Glass 	int ret;
99*9569c406SSimon Glass 
100*9569c406SSimon Glass 	ret = pci_io_read(addr, &value, PCI_SIZE_32);
101*9569c406SSimon Glass 
102*9569c406SSimon Glass 	return ret ? 0 : value;
103*9569c406SSimon Glass }
104*9569c406SSimon Glass 
inw(unsigned int addr)105*9569c406SSimon Glass int inw(unsigned int addr)
106*9569c406SSimon Glass {
107*9569c406SSimon Glass 	unsigned long value;
108*9569c406SSimon Glass 	int ret;
109*9569c406SSimon Glass 
110*9569c406SSimon Glass 	ret = pci_io_read(addr, &value, PCI_SIZE_16);
111*9569c406SSimon Glass 
112*9569c406SSimon Glass 	return ret ? 0 : value;
113*9569c406SSimon Glass }
114*9569c406SSimon Glass 
inb(unsigned int addr)115*9569c406SSimon Glass int inb(unsigned int addr)
116*9569c406SSimon Glass {
117*9569c406SSimon Glass 	unsigned long value;
118*9569c406SSimon Glass 	int ret;
119*9569c406SSimon Glass 
120*9569c406SSimon Glass 	ret = pci_io_read(addr, &value, PCI_SIZE_8);
121*9569c406SSimon Glass 
122*9569c406SSimon Glass 	return ret ? 0 : value;
123*9569c406SSimon Glass }
124*9569c406SSimon Glass 
outl(unsigned int value,unsigned int addr)125*9569c406SSimon Glass void outl(unsigned int value, unsigned int addr)
126*9569c406SSimon Glass {
127*9569c406SSimon Glass 	pci_io_write(addr, value, PCI_SIZE_32);
128*9569c406SSimon Glass }
129*9569c406SSimon Glass 
outw(unsigned int value,unsigned int addr)130*9569c406SSimon Glass void outw(unsigned int value, unsigned int addr)
131*9569c406SSimon Glass {
132*9569c406SSimon Glass 	pci_io_write(addr, value, PCI_SIZE_16);
133*9569c406SSimon Glass }
134*9569c406SSimon Glass 
outb(unsigned int value,unsigned int addr)135*9569c406SSimon Glass void outb(unsigned int value, unsigned int addr)
136*9569c406SSimon Glass {
137*9569c406SSimon Glass 	pci_io_write(addr, value, PCI_SIZE_8);
138*9569c406SSimon Glass }
139