00001 #include <l4/dde/ddekit/pci.h>
00002 #include <l4/dde/ddekit/printf.h>
00003 #include <l4/dde/ddekit/panic.h>
00004 #include <l4/dde/ddekit/memory.h>
00005 #include <l4/dde/ddekit/assert.h>
00006
00007 #include <l4/generic_io/types.h>
00008 #include <l4/generic_io/libio.h>
00009 #include <l4/env/errno.h>
00010 #include <l4/log/l4log.h>
00011
00012 #include "config.h"
00013
00014 #define dbg_this 0
00015
00016 #define MAX_PCI_DEVS 32
00017
00018
00019 typedef struct ddekit_pci_dev {
00020 int bus;
00021 int slot;
00022 int func;
00023 l4io_pci_dev_t l4dev;
00024 struct ddekit_pci_dev *next;
00025 } ddekit_pci_dev_t;
00026
00027 static ddekit_pci_dev_t ddekit_pci_bus[MAX_PCI_DEVS];
00028
00029 static inline int invalid_device(ddekit_pci_dev_t *d)
00030 {
00031 return d->slot == -1;
00032 }
00033
00034
00035
00036
00037
00038
00039
00040
00041 void ddekit_pci_init(void)
00042 {
00043 l4io_pdev_t start = 0;
00044
00045 int slots_found = 0;
00046 int i;
00047
00048
00049 for (i = 0; i < MAX_PCI_DEVS; i++)
00050 ddekit_pci_bus[i].slot = -1;
00051
00052 while (1) {
00053 l4io_pci_dev_t l4dev;
00054 int err;
00055
00056
00057 err = l4io_pci_find_device(~0, ~0, start, &l4dev);
00058 if (err) {
00059 if (err == -L4_ENOTFOUND) {
00060 LOGd(dbg_this, "no more pci devices");
00061 } else {
00062 LOGd(dbg_this, "error: scanning pci devices: %s (%d)", l4env_errstr(err), err);
00063 }
00064 break;
00065 }
00066
00067
00068 start = l4dev.handle;
00069
00070
00071
00072
00073 ddekit_pci_bus[slots_found].bus = 0;
00074 ddekit_pci_bus[slots_found].slot = slots_found;
00075 ddekit_pci_bus[slots_found].func = 0;
00076 ddekit_pci_bus[slots_found].l4dev = l4dev;
00077
00078 LOGd(dbg_this, "pcib_identify: found device (%x, %x, %x), mapped to (%x, %x, %x)",
00079 l4dev.bus, l4dev.devfn >> 3, l4dev.devfn & 0x07,
00080 ddekit_pci_bus[slots_found].bus,
00081 ddekit_pci_bus[slots_found].slot,
00082 ddekit_pci_bus[slots_found].func);
00083
00084 ++slots_found;
00085 }
00086 }
00087
00088
00089
00090
00091
00092
00093
00094 int ddekit_pci_get_device(int nr, int *bus, int *slot, int *func)
00095 {
00096 ddekit_pci_dev_t *dev;
00097
00098 LOGd(dbg_this, "searching for dev #%d", nr);
00099
00100 if (nr >= 0 && nr < MAX_PCI_DEVS && !invalid_device(&ddekit_pci_bus[nr])) {
00101 dev = &ddekit_pci_bus[nr];
00102 *bus = dev->bus;
00103 *slot = dev->slot;
00104 *func = dev->func;
00105 return 0;
00106 }
00107
00108 return -1;
00109 }
00110
00111
00112 ddekit_pci_dev_t *ddekit_pci_find_device(int *bus, int *slot, int *func,
00113 ddekit_pci_dev_t *start)
00114 {
00115 Assert(bus);
00116 Assert(slot);
00117 Assert(func);
00118
00119 LOGd(dbg_this, "start %p (slot %d)", start, start ? start->slot : -1);
00120 int idx = start ? start->slot + 1 : 0;
00121
00122 for ( ; idx < MAX_PCI_DEVS; ++idx) {
00123 ddekit_pci_dev_t *dev = &ddekit_pci_bus[idx];
00124 if (!invalid_device(dev) &&
00125 (*bus == DDEKIT_PCI_ANY_ID || dev->bus == *bus) &&
00126 (*slot == DDEKIT_PCI_ANY_ID || dev->slot == *slot) &&
00127 (*func == DDEKIT_PCI_ANY_ID || dev->func == *func)) {
00128 *bus = dev->bus;
00129 *slot = dev->slot;
00130 *func = dev->func;
00131 return dev;
00132 }
00133 }
00134
00135 return NULL;
00136 }
00137
00138 int ddekit_pci_read(int bus, int slot, int func, int pos, int len, ddekit_uint32_t *val)
00139 {
00140 switch(len)
00141 {
00142 case 1:
00143 return ddekit_pci_readb(bus, slot, func, pos, (ddekit_uint8_t *)val);
00144 case 2:
00145 return ddekit_pci_readw(bus, slot, func, pos, (ddekit_uint16_t *)val);
00146 case 4:
00147 return ddekit_pci_readl(bus, slot, func, pos, val);
00148 }
00149
00150 return -1;
00151 }
00152
00153 int ddekit_pci_write(int bus, int slot, int func, int pos, int len, ddekit_uint32_t val)
00154 {
00155 switch(len)
00156 {
00157 case 1:
00158 return ddekit_pci_writeb(bus, slot, func, pos, val);
00159 case 2:
00160 return ddekit_pci_writew(bus, slot, func, pos, val);
00161 case 4:
00162 return ddekit_pci_writel(bus, slot, func, pos, val);
00163 }
00164
00165 return -1;
00166 }
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 static inline ddekit_pci_dev_t *ddekit_pci_find_device_fixed(int bus, int slot, int func)
00178 {
00179 return &ddekit_pci_bus[slot];
00180 }
00181
00182
00183 int ddekit_pci_readb (int bus, int slot, int func, int pos, ddekit_uint8_t *val)
00184 {
00185 ddekit_pci_dev_t *dev = ddekit_pci_find_device_fixed(bus, slot, func);
00186 if (dev)
00187 return l4io_pci_readb_cfg(dev->l4dev.handle, pos, val);
00188 else
00189 return -1;
00190 }
00191
00192
00193 int ddekit_pci_readw (int bus, int slot, int func, int pos, ddekit_uint16_t *val)
00194 {
00195 ddekit_pci_dev_t *dev = ddekit_pci_find_device_fixed(bus, slot, func);
00196 if (dev)
00197 return l4io_pci_readw_cfg(dev->l4dev.handle, pos, val);
00198 else
00199 return -1;
00200 }
00201
00202
00203 int ddekit_pci_readl (int bus, int slot, int func, int pos, ddekit_uint32_t *val)
00204 {
00205 ddekit_pci_dev_t *dev = ddekit_pci_find_device_fixed(bus, slot, func);
00206 if (dev)
00207 return l4io_pci_readl_cfg(dev->l4dev.handle, pos, val);
00208 else
00209 return -1;
00210 }
00211
00212
00213 int ddekit_pci_writeb(int bus, int slot, int func, int pos, ddekit_uint8_t val)
00214 {
00215 ddekit_pci_dev_t *dev = ddekit_pci_find_device_fixed(bus, slot, func);
00216 if (dev)
00217 return l4io_pci_writeb_cfg(dev->l4dev.handle, pos, val);
00218 else
00219 return -1;
00220 }
00221
00222
00223 int ddekit_pci_writew(int bus, int slot, int func, int pos, ddekit_uint16_t val)
00224 {
00225 ddekit_pci_dev_t *dev = ddekit_pci_find_device_fixed(bus, slot, func);
00226 if (dev)
00227 return l4io_pci_writew_cfg(dev->l4dev.handle, pos, val);
00228 else
00229 return -1;
00230 }
00231
00232
00233 int ddekit_pci_writel(int bus, int slot, int func, int pos, ddekit_uint32_t val)
00234 {
00235 ddekit_pci_dev_t *dev = ddekit_pci_find_device_fixed(bus, slot, func);
00236 if (dev)
00237 return l4io_pci_writel_cfg(dev->l4dev.handle, pos, val);
00238 else
00239 return -1;
00240 }
00241
00242 int ddekit_pci_enable_device(struct ddekit_pci_dev *dev)
00243 {
00244 return l4io_pci_enable(dev->l4dev.handle);
00245 }
00246
00247 int ddekit_pci_disable_device(struct ddekit_pci_dev *dev)
00248 {
00249 return l4io_pci_disable(dev->l4dev.handle);
00250 }
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265 unsigned short ddekit_pci_get_vendor(struct ddekit_pci_dev *dev)
00266 {
00267 return dev->l4dev.vendor;
00268 }
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 unsigned short ddekit_pci_get_device_id(struct ddekit_pci_dev *dev)
00279 {
00280 return dev->l4dev.device;
00281 }
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 unsigned short ddekit_pci_get_sub_vendor(struct ddekit_pci_dev *dev)
00292 {
00293 return dev->l4dev.sub_vendor;
00294 }
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 unsigned short ddekit_pci_get_sub_device(struct ddekit_pci_dev *dev)
00305 {
00306 return dev->l4dev.sub_device;
00307 }
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 unsigned ddekit_pci_get_dev_class(struct ddekit_pci_dev *dev)
00318 {
00319 return dev->l4dev.dev_class;
00320 }
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330 unsigned long ddekit_pci_get_irq(struct ddekit_pci_dev *dev)
00331 {
00332 return dev->l4dev.irq;
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 char *ddekit_pci_get_name(struct ddekit_pci_dev *dev)
00344 {
00345 return dev->l4dev.name;
00346 }
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 char *ddekit_pci_get_slot_name(struct ddekit_pci_dev *dev)
00357 {
00358 return dev->l4dev.slot_name;
00359 }
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 ddekit_pci_res_t *ddekit_pci_get_resource(struct ddekit_pci_dev *dev, unsigned int idx)
00371 {
00372 if (idx > L4IO_PCIDEV_RES)
00373 return NULL;
00374
00375 return (ddekit_pci_res_t *)(&(dev->l4dev.res[idx]));
00376 }
00377
00378
00379
00380
00381
00382
00383
00384 void ddekit_pci_set_master(struct ddekit_pci_dev *dev)
00385 {
00386 l4io_pci_set_master(dev->l4dev.handle);
00387 }
00388
00389 int ddekit_pci_irq_enable(int bus, int slot, int func, int pin, int *irq)
00390 {
00391 return 0;
00392 }