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