xref: /aosp_15_r20/external/pciutils/lib/generic.c (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
1*c2e0c6b5SAndroid Build Coastguard Worker /*
2*c2e0c6b5SAndroid Build Coastguard Worker  *	The PCI Library -- Generic Direct Access Functions
3*c2e0c6b5SAndroid Build Coastguard Worker  *
4*c2e0c6b5SAndroid Build Coastguard Worker  *	Copyright (c) 1997--2022 Martin Mares <[email protected]>
5*c2e0c6b5SAndroid Build Coastguard Worker  *
6*c2e0c6b5SAndroid Build Coastguard Worker  *	Can be freely distributed and used under the terms of the GNU GPL v2+.
7*c2e0c6b5SAndroid Build Coastguard Worker  *
8*c2e0c6b5SAndroid Build Coastguard Worker  *	SPDX-License-Identifier: GPL-2.0-or-later
9*c2e0c6b5SAndroid Build Coastguard Worker  */
10*c2e0c6b5SAndroid Build Coastguard Worker 
11*c2e0c6b5SAndroid Build Coastguard Worker #include <string.h>
12*c2e0c6b5SAndroid Build Coastguard Worker 
13*c2e0c6b5SAndroid Build Coastguard Worker #include "internal.h"
14*c2e0c6b5SAndroid Build Coastguard Worker 
15*c2e0c6b5SAndroid Build Coastguard Worker void
pci_generic_scan_bus(struct pci_access * a,byte * busmap,int domain,int bus)16*c2e0c6b5SAndroid Build Coastguard Worker pci_generic_scan_bus(struct pci_access *a, byte *busmap, int domain, int bus)
17*c2e0c6b5SAndroid Build Coastguard Worker {
18*c2e0c6b5SAndroid Build Coastguard Worker   int dev, multi, ht;
19*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *t;
20*c2e0c6b5SAndroid Build Coastguard Worker 
21*c2e0c6b5SAndroid Build Coastguard Worker   a->debug("Scanning bus %02x for devices...\n", bus);
22*c2e0c6b5SAndroid Build Coastguard Worker   if (busmap[bus])
23*c2e0c6b5SAndroid Build Coastguard Worker     {
24*c2e0c6b5SAndroid Build Coastguard Worker       a->warning("Bus %02x seen twice (firmware bug). Ignored.", bus);
25*c2e0c6b5SAndroid Build Coastguard Worker       return;
26*c2e0c6b5SAndroid Build Coastguard Worker     }
27*c2e0c6b5SAndroid Build Coastguard Worker   busmap[bus] = 1;
28*c2e0c6b5SAndroid Build Coastguard Worker   t = pci_alloc_dev(a);
29*c2e0c6b5SAndroid Build Coastguard Worker   t->domain = domain;
30*c2e0c6b5SAndroid Build Coastguard Worker   t->bus = bus;
31*c2e0c6b5SAndroid Build Coastguard Worker   for (dev=0; dev<32; dev++)
32*c2e0c6b5SAndroid Build Coastguard Worker     {
33*c2e0c6b5SAndroid Build Coastguard Worker       t->dev = dev;
34*c2e0c6b5SAndroid Build Coastguard Worker       multi = 0;
35*c2e0c6b5SAndroid Build Coastguard Worker       for (t->func=0; !t->func || multi && t->func<8; t->func++)
36*c2e0c6b5SAndroid Build Coastguard Worker 	{
37*c2e0c6b5SAndroid Build Coastguard Worker 	  u32 vd = pci_read_long(t, PCI_VENDOR_ID);
38*c2e0c6b5SAndroid Build Coastguard Worker 	  struct pci_dev *d;
39*c2e0c6b5SAndroid Build Coastguard Worker 
40*c2e0c6b5SAndroid Build Coastguard Worker 	  if (!vd || vd == 0xffffffff)
41*c2e0c6b5SAndroid Build Coastguard Worker 	    continue;
42*c2e0c6b5SAndroid Build Coastguard Worker 	  ht = pci_read_byte(t, PCI_HEADER_TYPE);
43*c2e0c6b5SAndroid Build Coastguard Worker 	  if (!t->func)
44*c2e0c6b5SAndroid Build Coastguard Worker 	    multi = ht & 0x80;
45*c2e0c6b5SAndroid Build Coastguard Worker 	  ht &= 0x7f;
46*c2e0c6b5SAndroid Build Coastguard Worker 	  d = pci_alloc_dev(a);
47*c2e0c6b5SAndroid Build Coastguard Worker 	  d->domain = t->domain;
48*c2e0c6b5SAndroid Build Coastguard Worker 	  d->bus = t->bus;
49*c2e0c6b5SAndroid Build Coastguard Worker 	  d->dev = t->dev;
50*c2e0c6b5SAndroid Build Coastguard Worker 	  d->func = t->func;
51*c2e0c6b5SAndroid Build Coastguard Worker 	  d->vendor_id = vd & 0xffff;
52*c2e0c6b5SAndroid Build Coastguard Worker 	  d->device_id = vd >> 16U;
53*c2e0c6b5SAndroid Build Coastguard Worker 	  d->known_fields = PCI_FILL_IDENT;
54*c2e0c6b5SAndroid Build Coastguard Worker 	  d->hdrtype = ht;
55*c2e0c6b5SAndroid Build Coastguard Worker 	  pci_link_dev(a, d);
56*c2e0c6b5SAndroid Build Coastguard Worker 	  switch (ht)
57*c2e0c6b5SAndroid Build Coastguard Worker 	    {
58*c2e0c6b5SAndroid Build Coastguard Worker 	    case PCI_HEADER_TYPE_NORMAL:
59*c2e0c6b5SAndroid Build Coastguard Worker 	      break;
60*c2e0c6b5SAndroid Build Coastguard Worker 	    case PCI_HEADER_TYPE_BRIDGE:
61*c2e0c6b5SAndroid Build Coastguard Worker 	    case PCI_HEADER_TYPE_CARDBUS:
62*c2e0c6b5SAndroid Build Coastguard Worker 	      pci_generic_scan_bus(a, busmap, domain, pci_read_byte(t, PCI_SECONDARY_BUS));
63*c2e0c6b5SAndroid Build Coastguard Worker 	      break;
64*c2e0c6b5SAndroid Build Coastguard Worker 	    default:
65*c2e0c6b5SAndroid Build Coastguard Worker 	      a->debug("Device %04x:%02x:%02x.%d has unknown header type %02x.\n", d->domain, d->bus, d->dev, d->func, ht);
66*c2e0c6b5SAndroid Build Coastguard Worker 	    }
67*c2e0c6b5SAndroid Build Coastguard Worker 	}
68*c2e0c6b5SAndroid Build Coastguard Worker     }
69*c2e0c6b5SAndroid Build Coastguard Worker   pci_free_dev(t);
70*c2e0c6b5SAndroid Build Coastguard Worker }
71*c2e0c6b5SAndroid Build Coastguard Worker 
72*c2e0c6b5SAndroid Build Coastguard Worker void
pci_generic_scan_domain(struct pci_access * a,int domain)73*c2e0c6b5SAndroid Build Coastguard Worker pci_generic_scan_domain(struct pci_access *a, int domain)
74*c2e0c6b5SAndroid Build Coastguard Worker {
75*c2e0c6b5SAndroid Build Coastguard Worker   byte busmap[256];
76*c2e0c6b5SAndroid Build Coastguard Worker 
77*c2e0c6b5SAndroid Build Coastguard Worker   memset(busmap, 0, sizeof(busmap));
78*c2e0c6b5SAndroid Build Coastguard Worker   pci_generic_scan_bus(a, busmap, domain, 0);
79*c2e0c6b5SAndroid Build Coastguard Worker }
80*c2e0c6b5SAndroid Build Coastguard Worker 
81*c2e0c6b5SAndroid Build Coastguard Worker void
pci_generic_scan(struct pci_access * a)82*c2e0c6b5SAndroid Build Coastguard Worker pci_generic_scan(struct pci_access *a)
83*c2e0c6b5SAndroid Build Coastguard Worker {
84*c2e0c6b5SAndroid Build Coastguard Worker   pci_generic_scan_domain(a, 0);
85*c2e0c6b5SAndroid Build Coastguard Worker }
86*c2e0c6b5SAndroid Build Coastguard Worker 
87*c2e0c6b5SAndroid Build Coastguard Worker static int
get_hdr_type(struct pci_dev * d)88*c2e0c6b5SAndroid Build Coastguard Worker get_hdr_type(struct pci_dev *d)
89*c2e0c6b5SAndroid Build Coastguard Worker {
90*c2e0c6b5SAndroid Build Coastguard Worker   if (d->hdrtype < 0)
91*c2e0c6b5SAndroid Build Coastguard Worker     d->hdrtype = pci_read_byte(d, PCI_HEADER_TYPE) & 0x7f;
92*c2e0c6b5SAndroid Build Coastguard Worker   return d->hdrtype;
93*c2e0c6b5SAndroid Build Coastguard Worker }
94*c2e0c6b5SAndroid Build Coastguard Worker 
95*c2e0c6b5SAndroid Build Coastguard Worker void
pci_generic_fill_info(struct pci_dev * d,unsigned int flags)96*c2e0c6b5SAndroid Build Coastguard Worker pci_generic_fill_info(struct pci_dev *d, unsigned int flags)
97*c2e0c6b5SAndroid Build Coastguard Worker {
98*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_access *a = d->access;
99*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_cap *cap;
100*c2e0c6b5SAndroid Build Coastguard Worker 
101*c2e0c6b5SAndroid Build Coastguard Worker   if (want_fill(d, flags, PCI_FILL_IDENT))
102*c2e0c6b5SAndroid Build Coastguard Worker     {
103*c2e0c6b5SAndroid Build Coastguard Worker       d->vendor_id = pci_read_word(d, PCI_VENDOR_ID);
104*c2e0c6b5SAndroid Build Coastguard Worker       d->device_id = pci_read_word(d, PCI_DEVICE_ID);
105*c2e0c6b5SAndroid Build Coastguard Worker     }
106*c2e0c6b5SAndroid Build Coastguard Worker 
107*c2e0c6b5SAndroid Build Coastguard Worker   if (want_fill(d, flags, PCI_FILL_CLASS))
108*c2e0c6b5SAndroid Build Coastguard Worker     d->device_class = pci_read_word(d, PCI_CLASS_DEVICE);
109*c2e0c6b5SAndroid Build Coastguard Worker 
110*c2e0c6b5SAndroid Build Coastguard Worker   if (want_fill(d, flags, PCI_FILL_CLASS_EXT))
111*c2e0c6b5SAndroid Build Coastguard Worker     {
112*c2e0c6b5SAndroid Build Coastguard Worker       d->prog_if = pci_read_byte(d, PCI_CLASS_PROG);
113*c2e0c6b5SAndroid Build Coastguard Worker       d->rev_id = pci_read_byte(d, PCI_REVISION_ID);
114*c2e0c6b5SAndroid Build Coastguard Worker     }
115*c2e0c6b5SAndroid Build Coastguard Worker 
116*c2e0c6b5SAndroid Build Coastguard Worker   if (want_fill(d, flags, PCI_FILL_SUBSYS))
117*c2e0c6b5SAndroid Build Coastguard Worker     {
118*c2e0c6b5SAndroid Build Coastguard Worker       switch (get_hdr_type(d))
119*c2e0c6b5SAndroid Build Coastguard Worker         {
120*c2e0c6b5SAndroid Build Coastguard Worker         case PCI_HEADER_TYPE_NORMAL:
121*c2e0c6b5SAndroid Build Coastguard Worker           d->subsys_vendor_id = pci_read_word(d, PCI_SUBSYSTEM_VENDOR_ID);
122*c2e0c6b5SAndroid Build Coastguard Worker           d->subsys_id = pci_read_word(d, PCI_SUBSYSTEM_ID);
123*c2e0c6b5SAndroid Build Coastguard Worker           break;
124*c2e0c6b5SAndroid Build Coastguard Worker         case PCI_HEADER_TYPE_BRIDGE:
125*c2e0c6b5SAndroid Build Coastguard Worker           cap = pci_find_cap(d, PCI_CAP_ID_SSVID, PCI_CAP_NORMAL);
126*c2e0c6b5SAndroid Build Coastguard Worker           if (cap)
127*c2e0c6b5SAndroid Build Coastguard Worker             {
128*c2e0c6b5SAndroid Build Coastguard Worker               d->subsys_vendor_id = pci_read_word(d, cap->addr + PCI_SSVID_VENDOR);
129*c2e0c6b5SAndroid Build Coastguard Worker               d->subsys_id = pci_read_word(d, cap->addr + PCI_SSVID_DEVICE);
130*c2e0c6b5SAndroid Build Coastguard Worker             }
131*c2e0c6b5SAndroid Build Coastguard Worker           break;
132*c2e0c6b5SAndroid Build Coastguard Worker         case PCI_HEADER_TYPE_CARDBUS:
133*c2e0c6b5SAndroid Build Coastguard Worker           d->subsys_vendor_id = pci_read_word(d, PCI_CB_SUBSYSTEM_VENDOR_ID);
134*c2e0c6b5SAndroid Build Coastguard Worker           d->subsys_id = pci_read_word(d, PCI_CB_SUBSYSTEM_ID);
135*c2e0c6b5SAndroid Build Coastguard Worker           break;
136*c2e0c6b5SAndroid Build Coastguard Worker         default:
137*c2e0c6b5SAndroid Build Coastguard Worker           clear_fill(d, PCI_FILL_SUBSYS);
138*c2e0c6b5SAndroid Build Coastguard Worker         }
139*c2e0c6b5SAndroid Build Coastguard Worker     }
140*c2e0c6b5SAndroid Build Coastguard Worker 
141*c2e0c6b5SAndroid Build Coastguard Worker   if (want_fill(d, flags, PCI_FILL_IRQ))
142*c2e0c6b5SAndroid Build Coastguard Worker     d->irq = pci_read_byte(d, PCI_INTERRUPT_LINE);
143*c2e0c6b5SAndroid Build Coastguard Worker 
144*c2e0c6b5SAndroid Build Coastguard Worker   if (want_fill(d, flags, PCI_FILL_BASES))
145*c2e0c6b5SAndroid Build Coastguard Worker     {
146*c2e0c6b5SAndroid Build Coastguard Worker       int cnt = 0, i;
147*c2e0c6b5SAndroid Build Coastguard Worker       memset(d->base_addr, 0, sizeof(d->base_addr));
148*c2e0c6b5SAndroid Build Coastguard Worker       switch (get_hdr_type(d))
149*c2e0c6b5SAndroid Build Coastguard Worker 	{
150*c2e0c6b5SAndroid Build Coastguard Worker 	case PCI_HEADER_TYPE_NORMAL:
151*c2e0c6b5SAndroid Build Coastguard Worker 	  cnt = 6;
152*c2e0c6b5SAndroid Build Coastguard Worker 	  break;
153*c2e0c6b5SAndroid Build Coastguard Worker 	case PCI_HEADER_TYPE_BRIDGE:
154*c2e0c6b5SAndroid Build Coastguard Worker 	  cnt = 2;
155*c2e0c6b5SAndroid Build Coastguard Worker 	  break;
156*c2e0c6b5SAndroid Build Coastguard Worker 	case PCI_HEADER_TYPE_CARDBUS:
157*c2e0c6b5SAndroid Build Coastguard Worker 	  cnt = 1;
158*c2e0c6b5SAndroid Build Coastguard Worker 	  break;
159*c2e0c6b5SAndroid Build Coastguard Worker 	}
160*c2e0c6b5SAndroid Build Coastguard Worker       if (cnt)
161*c2e0c6b5SAndroid Build Coastguard Worker 	{
162*c2e0c6b5SAndroid Build Coastguard Worker 	  for (i=0; i<cnt; i++)
163*c2e0c6b5SAndroid Build Coastguard Worker 	    {
164*c2e0c6b5SAndroid Build Coastguard Worker 	      u32 x = pci_read_long(d, PCI_BASE_ADDRESS_0 + i*4);
165*c2e0c6b5SAndroid Build Coastguard Worker 	      if (!x || x == (u32) ~0)
166*c2e0c6b5SAndroid Build Coastguard Worker 		continue;
167*c2e0c6b5SAndroid Build Coastguard Worker 	      if ((x & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
168*c2e0c6b5SAndroid Build Coastguard Worker 		d->base_addr[i] = x;
169*c2e0c6b5SAndroid Build Coastguard Worker 	      else
170*c2e0c6b5SAndroid Build Coastguard Worker 		{
171*c2e0c6b5SAndroid Build Coastguard Worker 		  if ((x & PCI_BASE_ADDRESS_MEM_TYPE_MASK) != PCI_BASE_ADDRESS_MEM_TYPE_64)
172*c2e0c6b5SAndroid Build Coastguard Worker 		    d->base_addr[i] = x;
173*c2e0c6b5SAndroid Build Coastguard Worker 		  else if (i >= cnt-1)
174*c2e0c6b5SAndroid Build Coastguard Worker 		    a->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.", d->domain, d->bus, d->dev, d->func, i);
175*c2e0c6b5SAndroid Build Coastguard Worker 		  else
176*c2e0c6b5SAndroid Build Coastguard Worker 		    {
177*c2e0c6b5SAndroid Build Coastguard Worker 		      u32 y = pci_read_long(d, PCI_BASE_ADDRESS_0 + (++i)*4);
178*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_HAVE_64BIT_ADDRESS
179*c2e0c6b5SAndroid Build Coastguard Worker 		      d->base_addr[i-1] = x | (((pciaddr_t) y) << 32);
180*c2e0c6b5SAndroid Build Coastguard Worker #else
181*c2e0c6b5SAndroid Build Coastguard Worker 		      if (y)
182*c2e0c6b5SAndroid Build Coastguard Worker 			a->warning("%04x:%02x:%02x.%d 64-bit device address ignored.", d->domain, d->bus, d->dev, d->func);
183*c2e0c6b5SAndroid Build Coastguard Worker 		      else
184*c2e0c6b5SAndroid Build Coastguard Worker 			d->base_addr[i-1] = x;
185*c2e0c6b5SAndroid Build Coastguard Worker #endif
186*c2e0c6b5SAndroid Build Coastguard Worker 		    }
187*c2e0c6b5SAndroid Build Coastguard Worker 		}
188*c2e0c6b5SAndroid Build Coastguard Worker 	    }
189*c2e0c6b5SAndroid Build Coastguard Worker 	}
190*c2e0c6b5SAndroid Build Coastguard Worker     }
191*c2e0c6b5SAndroid Build Coastguard Worker 
192*c2e0c6b5SAndroid Build Coastguard Worker   if (want_fill(d, flags, PCI_FILL_ROM_BASE))
193*c2e0c6b5SAndroid Build Coastguard Worker     {
194*c2e0c6b5SAndroid Build Coastguard Worker       int reg = 0;
195*c2e0c6b5SAndroid Build Coastguard Worker       d->rom_base_addr = 0;
196*c2e0c6b5SAndroid Build Coastguard Worker       switch (get_hdr_type(d))
197*c2e0c6b5SAndroid Build Coastguard Worker 	{
198*c2e0c6b5SAndroid Build Coastguard Worker 	case PCI_HEADER_TYPE_NORMAL:
199*c2e0c6b5SAndroid Build Coastguard Worker 	  reg = PCI_ROM_ADDRESS;
200*c2e0c6b5SAndroid Build Coastguard Worker 	  break;
201*c2e0c6b5SAndroid Build Coastguard Worker 	case PCI_HEADER_TYPE_BRIDGE:
202*c2e0c6b5SAndroid Build Coastguard Worker 	  reg = PCI_ROM_ADDRESS1;
203*c2e0c6b5SAndroid Build Coastguard Worker 	  break;
204*c2e0c6b5SAndroid Build Coastguard Worker 	}
205*c2e0c6b5SAndroid Build Coastguard Worker       if (reg)
206*c2e0c6b5SAndroid Build Coastguard Worker 	{
207*c2e0c6b5SAndroid Build Coastguard Worker 	  u32 u = pci_read_long(d, reg);
208*c2e0c6b5SAndroid Build Coastguard Worker 	  if (u != 0xffffffff)
209*c2e0c6b5SAndroid Build Coastguard Worker 	    d->rom_base_addr = u;
210*c2e0c6b5SAndroid Build Coastguard Worker 	}
211*c2e0c6b5SAndroid Build Coastguard Worker     }
212*c2e0c6b5SAndroid Build Coastguard Worker 
213*c2e0c6b5SAndroid Build Coastguard Worker   pci_scan_caps(d, flags);
214*c2e0c6b5SAndroid Build Coastguard Worker }
215*c2e0c6b5SAndroid Build Coastguard Worker 
216*c2e0c6b5SAndroid Build Coastguard Worker static int
pci_generic_block_op(struct pci_dev * d,int pos,byte * buf,int len,int (* r)(struct pci_dev * d,int pos,byte * buf,int len))217*c2e0c6b5SAndroid Build Coastguard Worker pci_generic_block_op(struct pci_dev *d, int pos, byte *buf, int len,
218*c2e0c6b5SAndroid Build Coastguard Worker 		 int (*r)(struct pci_dev *d, int pos, byte *buf, int len))
219*c2e0c6b5SAndroid Build Coastguard Worker {
220*c2e0c6b5SAndroid Build Coastguard Worker   if ((pos & 1) && len >= 1)
221*c2e0c6b5SAndroid Build Coastguard Worker     {
222*c2e0c6b5SAndroid Build Coastguard Worker       if (!r(d, pos, buf, 1))
223*c2e0c6b5SAndroid Build Coastguard Worker 	return 0;
224*c2e0c6b5SAndroid Build Coastguard Worker       pos++; buf++; len--;
225*c2e0c6b5SAndroid Build Coastguard Worker     }
226*c2e0c6b5SAndroid Build Coastguard Worker   if ((pos & 3) && len >= 2)
227*c2e0c6b5SAndroid Build Coastguard Worker     {
228*c2e0c6b5SAndroid Build Coastguard Worker       if (!r(d, pos, buf, 2))
229*c2e0c6b5SAndroid Build Coastguard Worker 	return 0;
230*c2e0c6b5SAndroid Build Coastguard Worker       pos += 2; buf += 2; len -= 2;
231*c2e0c6b5SAndroid Build Coastguard Worker     }
232*c2e0c6b5SAndroid Build Coastguard Worker   while (len >= 4)
233*c2e0c6b5SAndroid Build Coastguard Worker     {
234*c2e0c6b5SAndroid Build Coastguard Worker       if (!r(d, pos, buf, 4))
235*c2e0c6b5SAndroid Build Coastguard Worker 	return 0;
236*c2e0c6b5SAndroid Build Coastguard Worker       pos += 4; buf += 4; len -= 4;
237*c2e0c6b5SAndroid Build Coastguard Worker     }
238*c2e0c6b5SAndroid Build Coastguard Worker   if (len >= 2)
239*c2e0c6b5SAndroid Build Coastguard Worker     {
240*c2e0c6b5SAndroid Build Coastguard Worker       if (!r(d, pos, buf, 2))
241*c2e0c6b5SAndroid Build Coastguard Worker 	return 0;
242*c2e0c6b5SAndroid Build Coastguard Worker       pos += 2; buf += 2; len -= 2;
243*c2e0c6b5SAndroid Build Coastguard Worker     }
244*c2e0c6b5SAndroid Build Coastguard Worker   if (len && !r(d, pos, buf, 1))
245*c2e0c6b5SAndroid Build Coastguard Worker     return 0;
246*c2e0c6b5SAndroid Build Coastguard Worker   return 1;
247*c2e0c6b5SAndroid Build Coastguard Worker }
248*c2e0c6b5SAndroid Build Coastguard Worker 
249*c2e0c6b5SAndroid Build Coastguard Worker int
pci_generic_block_read(struct pci_dev * d,int pos,byte * buf,int len)250*c2e0c6b5SAndroid Build Coastguard Worker pci_generic_block_read(struct pci_dev *d, int pos, byte *buf, int len)
251*c2e0c6b5SAndroid Build Coastguard Worker {
252*c2e0c6b5SAndroid Build Coastguard Worker   return pci_generic_block_op(d, pos, buf, len, d->access->methods->read);
253*c2e0c6b5SAndroid Build Coastguard Worker }
254*c2e0c6b5SAndroid Build Coastguard Worker 
255*c2e0c6b5SAndroid Build Coastguard Worker int
pci_generic_block_write(struct pci_dev * d,int pos,byte * buf,int len)256*c2e0c6b5SAndroid Build Coastguard Worker pci_generic_block_write(struct pci_dev *d, int pos, byte *buf, int len)
257*c2e0c6b5SAndroid Build Coastguard Worker {
258*c2e0c6b5SAndroid Build Coastguard Worker   return pci_generic_block_op(d, pos, buf, len, d->access->methods->write);
259*c2e0c6b5SAndroid Build Coastguard Worker }
260