|
Lines 122-128
Link Here
|
| 122 |
|
122 |
|
| 123 |
struct puc_device { |
123 |
struct puc_device { |
| 124 |
struct resource_list resources; |
124 |
struct resource_list resources; |
|
|
125 |
u_int type; /* the type of the port: PUC_TYPE_NONE, _COM, |
| 126 |
* _LPT */ |
| 125 |
u_int serialfreq; |
127 |
u_int serialfreq; |
|
|
128 |
u_int ppc_capabilities; /* flags for the LPT */ |
| 129 |
u_int baserid;/* address of base register for LPT */ |
| 126 |
}; |
130 |
}; |
| 127 |
|
131 |
|
| 128 |
static int puc_pci_probe(device_t dev); |
132 |
static int puc_pci_probe(device_t dev); |
|
Lines 151-156
Link Here
|
| 151 |
static void puc_print_resource_list(struct resource_list *); |
155 |
static void puc_print_resource_list(struct resource_list *); |
| 152 |
#endif |
156 |
#endif |
| 153 |
|
157 |
|
|
|
158 |
|
| 159 |
/* allocate the a second IOPORT for LPT devices that need it */ |
| 160 |
static void |
| 161 |
puc_alloc_ECP(device_t dev, struct puc_softc * sc, int xrid) |
| 162 |
{ |
| 163 |
struct resource *res; |
| 164 |
int rid, bidx; |
| 165 |
|
| 166 |
rid = xrid; |
| 167 |
bidx = PUC_PORT_BAR_INDEX(rid); |
| 168 |
if (sc->sc_bar_mappings[bidx].res != NULL) |
| 169 |
return; |
| 170 |
res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, |
| 171 |
0ul, ~0ul, 1, RF_ACTIVE); |
| 172 |
if (res == NULL) { |
| 173 |
printf("could not get resource\n"); |
| 174 |
return; |
| 175 |
} |
| 176 |
sc->sc_bar_mappings[bidx].res = res; |
| 177 |
#ifdef PUC_DEBUG |
| 178 |
printf("port bst %x, start %x, end %x\n", |
| 179 |
(u_int) rman_get_bustag(res), (u_int) rman_get_start(res), |
| 180 |
(u_int) rman_get_end(res)); |
| 181 |
#endif |
| 182 |
} |
| 183 |
|
| 154 |
static int |
184 |
static int |
| 155 |
puc_pci_probe(device_t dev) |
185 |
puc_pci_probe(device_t dev) |
| 156 |
{ |
186 |
{ |
|
Lines 236-243
Link Here
|
| 236 |
sc->sc_bar_mappings[bidx].res = res; |
267 |
sc->sc_bar_mappings[bidx].res = res; |
| 237 |
#ifdef PUC_DEBUG |
268 |
#ifdef PUC_DEBUG |
| 238 |
printf("port bst %x, start %x, end %x\n", |
269 |
printf("port bst %x, start %x, end %x\n", |
| 239 |
(u_int)rman_get_bustag(res), (u_int)rman_get_start(res), |
270 |
(u_int) rman_get_bustag(res), (u_int) rman_get_start(res), |
| 240 |
(u_int)rman_get_end(res)); |
271 |
(u_int) rman_get_end(res)); |
|
|
272 |
#endif |
| 273 |
#if 0 |
| 274 |
/* for an LPT we allocate a second region */ |
| 275 |
if ((sc->sc_desc->ports[i].type == PUC_PORT_TYPE_LPT) |
| 276 |
&& (sc->sc_desc->ports[i].serialfreq != 0x00)) { |
| 277 |
puc_alloc_ECP(dev, sc, 0x14); |
| 278 |
} |
| 241 |
#endif |
279 |
#endif |
| 242 |
} |
280 |
} |
| 243 |
|
281 |
|
|
Lines 251-257
Link Here
|
| 251 |
|
289 |
|
| 252 |
switch (sc->sc_desc->ports[i].type) { |
290 |
switch (sc->sc_desc->ports[i].type) { |
| 253 |
case PUC_PORT_TYPE_COM: |
291 |
case PUC_PORT_TYPE_COM: |
| 254 |
typestr = "sio"; |
292 |
break; |
|
|
293 |
case PUC_PORT_TYPE_LPT: |
| 255 |
break; |
294 |
break; |
| 256 |
default: |
295 |
default: |
| 257 |
continue; |
296 |
continue; |
|
Lines 286-292
Link Here
|
| 286 |
free(pdev, M_DEVBUF); |
326 |
free(pdev, M_DEVBUF); |
| 287 |
return (ENOMEM); |
327 |
return (ENOMEM); |
| 288 |
} |
328 |
} |
|
|
329 |
rle->res->r_start = rman_get_start(res) + |
| 330 |
sc->sc_desc->ports[i].offset; |
| 331 |
rle->res->r_end = rle->res->r_start + 8 - 1; |
| 332 |
rle->res->r_bustag = rman_get_bustag(res); |
| 333 |
bus_space_subregion(rle->res->r_bustag, |
| 334 |
rman_get_bushandle(res), |
| 335 |
sc->sc_desc->ports[i].offset, 8, |
| 336 |
&rle->res->r_bushandle); |
| 337 |
} |
| 338 |
#if 0 |
| 339 |
/* |
| 340 |
* if it is an LPT and we have a second IOPORT for ECP |
| 341 |
* allocated, then also copy it to the list |
| 342 |
*/ |
| 343 |
if ((sc->sc_desc->ports[i].type == PUC_PORT_TYPE_LPT) |
| 344 |
&& (sc->sc_desc->ports[i].type != 0x00)) { |
| 345 |
|
| 346 |
/* Now fake an IOPORT resource */ |
| 347 |
res = sc->sc_bar_mappings[bidx].res; |
| 348 |
resource_list_add(&pdev->resources, SYS_RES_IOPORT, 1, |
| 349 |
rman_get_start(res) + sc->sc_desc->ports[i].offset, |
| 350 |
rman_get_end(res) + sc->sc_desc->ports[i].offset + 8 - 1, |
| 351 |
8); |
| 352 |
rle = resource_list_find(&pdev->resources, SYS_RES_IOPORT, 1); |
| 289 |
|
353 |
|
|
|
354 |
if (sc->barmuxed == 0) { |
| 355 |
rle->res = sc->sc_bar_mappings[bidx].res; |
| 356 |
} else { |
| 357 |
rle->res = malloc(sizeof(struct resource), M_DEVBUF, |
| 358 |
M_WAITOK | M_ZERO); |
| 359 |
if (rle->res == NULL) { |
| 360 |
free(pdev, M_DEVBUF); |
| 361 |
return (ENOMEM); |
| 362 |
} |
| 290 |
rle->res->r_start = rman_get_start(res) + |
363 |
rle->res->r_start = rman_get_start(res) + |
| 291 |
sc->sc_desc->ports[i].offset; |
364 |
sc->sc_desc->ports[i].offset; |
| 292 |
rle->res->r_end = rle->res->r_start + 8 - 1; |
365 |
rle->res->r_end = rle->res->r_start + 8 - 1; |
|
Lines 296-304
Link Here
|
| 296 |
sc->sc_desc->ports[i].offset, 8, |
369 |
sc->sc_desc->ports[i].offset, 8, |
| 297 |
&rle->res->r_bushandle); |
370 |
&rle->res->r_bushandle); |
| 298 |
} |
371 |
} |
|
|
372 |
} |
| 373 |
#endif |
| 374 |
pdev->type = sc->sc_desc->ports[i].type; |
| 299 |
|
375 |
|
|
|
376 |
switch (pdev->type) { |
| 377 |
case PUC_PORT_TYPE_COM: |
| 378 |
typestr = "sio"; |
| 300 |
pdev->serialfreq = sc->sc_desc->ports[i].serialfreq; |
379 |
pdev->serialfreq = sc->sc_desc->ports[i].serialfreq; |
| 301 |
|
380 |
break; |
|
|
381 |
case PUC_PORT_TYPE_LPT: |
| 382 |
typestr = "ppc"; |
| 383 |
pdev->ppc_capabilities = sc->sc_desc->ports[i].serialfreq; |
| 384 |
pdev->baserid = sc->sc_desc->ports[i].bar; |
| 385 |
break; |
| 386 |
} |
| 302 |
childunit = puc_find_free_unit(typestr); |
387 |
childunit = puc_find_free_unit(typestr); |
| 303 |
sc->sc_ports[i].dev = device_add_child(dev, typestr, childunit); |
388 |
sc->sc_ports[i].dev = device_add_child(dev, typestr, childunit); |
| 304 |
if (sc->sc_ports[i].dev == NULL) { |
389 |
if (sc->sc_ports[i].dev == NULL) { |
|
Lines 320-326
Link Here
|
| 320 |
sc->sc_desc->ports[i].type, |
405 |
sc->sc_desc->ports[i].type, |
| 321 |
sc->sc_desc->ports[i].bar, |
406 |
sc->sc_desc->ports[i].bar, |
| 322 |
sc->sc_desc->ports[i].offset); |
407 |
sc->sc_desc->ports[i].offset); |
| 323 |
print_resource_list(&pdev->resources); |
408 |
puc_print_resource_list(&pdev->resources); |
| 324 |
#endif |
409 |
#endif |
| 325 |
if (device_probe_and_attach(sc->sc_ports[i].dev) != 0) { |
410 |
if (device_probe_and_attach(sc->sc_ports[i].dev) != 0) { |
| 326 |
if (sc->barmuxed) { |
411 |
if (sc->barmuxed) { |
|
Lines 343-350
Link Here
|
| 343 |
* This is just an brute force interrupt handler. It just calls all the |
428 |
* This is just an brute force interrupt handler. It just calls all the |
| 344 |
* registered handlers sequencially. |
429 |
* registered handlers sequencially. |
| 345 |
* |
430 |
* |
| 346 |
* Later on we should maybe have a different handler for boards that can |
431 |
* Later on we should maybe have a different handler for boards that can tell us |
| 347 |
* tell us which device generated the interrupt. |
432 |
* which device generated the interrupt. |
| 348 |
*/ |
433 |
*/ |
| 349 |
static void |
434 |
static void |
| 350 |
puc_intr(void *arg) |
435 |
puc_intr(void *arg) |
|
Lines 515-521
Link Here
|
| 515 |
#undef rdspio |
598 |
#undef rdspio |
| 516 |
#undef wrspio |
599 |
#undef wrspio |
| 517 |
|
600 |
|
| 518 |
static int puc_find_free_unit(char *name) |
601 |
static int |
|
|
602 |
puc_find_free_unit(char *name) |
| 519 |
{ |
603 |
{ |
| 520 |
devclass_t dc; |
604 |
devclass_t dc; |
| 521 |
int start; |
605 |
int start; |
|
Lines 543-552
Link Here
|
| 543 |
{ |
627 |
{ |
| 544 |
struct resource_list_entry *rle; |
628 |
struct resource_list_entry *rle; |
| 545 |
|
629 |
|
| 546 |
printf("print_resource_list: rl %p\n", rl); |
630 |
printf("puc_print_resource_list: rl %p\n", rl); |
| 547 |
SLIST_FOREACH(rle, rl, link) |
631 |
SLIST_FOREACH(rle, rl, link) |
| 548 |
printf("type %x, rid %x\n", rle->type, rle->rid); |
632 |
printf("type %x, rid %x\n", rle->type, rle->rid); |
| 549 |
printf("print_resource_list: end.\n"); |
633 |
printf("puc_print_resource_list: end.\n"); |
| 550 |
} |
634 |
} |
| 551 |
#endif |
635 |
#endif |
| 552 |
|
636 |
|
|
Lines 676-681
Link Here
|
| 676 |
case PUC_IVAR_FREQ: |
760 |
case PUC_IVAR_FREQ: |
| 677 |
*result = pdev->serialfreq; |
761 |
*result = pdev->serialfreq; |
| 678 |
break; |
762 |
break; |
|
|
763 |
case PUC_IVAR_TYPE: |
| 764 |
*result = pdev->type; |
| 765 |
break; |
| 766 |
case PUC_IVAR_BASERID: |
| 767 |
*result = pdev->baserid; |
| 768 |
break; |
| 769 |
/* |
| 770 |
* case PUC_IVAR_EXTREG: result = pdev->extreg; break; |
| 771 |
*/ |
| 772 |
case PUC_IVAR_PPCCAP: |
| 773 |
*result = pdev->ppc_capabilities; |
| 774 |
break; |
| 679 |
default: |
775 |
default: |
| 680 |
return (ENOENT); |
776 |
return (ENOENT); |
| 681 |
} |
777 |
} |