Changes in uspace/drv/bus/isa/isa.c [301032a:3e6a98c5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/isa/isa.c
r301032a r3e6a98c5 85 85 fibril_mutex_t mutex; 86 86 ddf_fun_t *fnode; 87 hw_resource_t resources[ISA_MAX_HW_RES];88 87 hw_resource_list_t hw_resources; 89 88 link_t bus_link; … … 104 103 static hw_resource_list_t *isa_get_fun_resources(ddf_fun_t *fnode) 105 104 { 106 isa_fun_t * isa= isa_fun(fnode);107 assert( isa);108 109 return & isa->hw_resources;110 } 111 112 static bool isa_ fun_enable_interrupt(ddf_fun_t *fnode)105 isa_fun_t *fun = isa_fun(fnode); 106 assert(fun != NULL); 107 108 return &fun->hw_resources; 109 } 110 111 static bool isa_enable_fun_interrupt(ddf_fun_t *fnode) 113 112 { 114 113 /* This is an old ugly way, copied from pci driver */ 115 114 assert(fnode); 116 isa_fun_t *isa = isa_fun(fnode); 117 assert(isa); 115 isa_fun_t *fun = isa_fun(fnode); 118 116 119 117 sysarg_t apic; … … 131 129 return false; 132 130 133 const hw_resource_list_t *res = & isa->hw_resources;131 const hw_resource_list_t *res = &fun->hw_resources; 134 132 assert(res); 135 133 for (size_t i = 0; i < res->count; ++i) { … … 153 151 } 154 152 155 static int isa_ fun_setup_dma(ddf_fun_t *fnode,156 unsigned int channel, uint32_t pa, uint 32_t size, uint8_t mode)153 static int isa_dma_channel_fun_setup(ddf_fun_t *fnode, 154 unsigned int channel, uint32_t pa, uint16_t size, uint8_t mode) 157 155 { 158 156 assert(fnode); 159 isa_fun_t *isa = isa_fun(fnode); 160 assert(isa); 161 const hw_resource_list_t *res = &isa->hw_resources; 157 isa_fun_t *fun = isa_fun(fnode); 158 const hw_resource_list_t *res = &fun->hw_resources; 162 159 assert(res); 163 160 161 const unsigned int ch = channel; 164 162 for (size_t i = 0; i < res->count; ++i) { 165 /* Check for assigned channel */166 163 if (((res->resources[i].type == DMA_CHANNEL_16) && 167 (res->resources[i].res.dma_channel.dma16 == ch annel)) ||164 (res->resources[i].res.dma_channel.dma16 == ch)) || 168 165 ((res->resources[i].type == DMA_CHANNEL_8) && 169 (res->resources[i].res.dma_channel.dma8 == ch annel))) {170 return dma_ channel_setup(channel, pa, size, mode);166 (res->resources[i].res.dma_channel.dma8 == ch))) { 167 return dma_setup_channel(channel, pa, size, mode); 171 168 } 172 169 } 173 174 return EINVAL; 175 } 176 177 static int isa_fun_remain_dma(ddf_fun_t *fnode, 178 unsigned channel, size_t *size) 179 { 180 assert(size); 181 assert(fnode); 182 isa_fun_t *isa = isa_fun(fnode); 183 assert(isa); 184 const hw_resource_list_t *res = &isa->hw_resources; 185 assert(res); 186 187 for (size_t i = 0; i < res->count; ++i) { 188 /* Check for assigned channel */ 189 if (((res->resources[i].type == DMA_CHANNEL_16) && 190 (res->resources[i].res.dma_channel.dma16 == channel)) || 191 ((res->resources[i].type == DMA_CHANNEL_8) && 192 (res->resources[i].res.dma_channel.dma8 == channel))) { 193 return dma_channel_remain(channel, size); 194 } 195 } 196 170 197 171 return EINVAL; 198 172 } … … 200 174 static hw_res_ops_t isa_fun_hw_res_ops = { 201 175 .get_resource_list = isa_get_fun_resources, 202 .enable_interrupt = isa_fun_enable_interrupt, 203 .dma_channel_setup = isa_fun_setup_dma, 204 .dma_channel_remain = isa_fun_remain_dma, 176 .enable_interrupt = isa_enable_fun_interrupt, 177 .dma_channel_setup = isa_dma_channel_fun_setup, 205 178 }; 206 179 207 static ddf_dev_ops_t isa_fun_ops= { 208 .interfaces[HW_RES_DEV_IFACE] = &isa_fun_hw_res_ops, 209 }; 180 static ddf_dev_ops_t isa_fun_ops; 210 181 211 182 static int isa_dev_add(ddf_dev_t *dev); … … 241 212 242 213 fibril_mutex_initialize(&fun->mutex); 243 fun->hw_resources.resources = fun->resources;244 245 214 fun->fnode = fnode; 246 215 return fun; … … 301 270 { 302 271 char *line = str; 303 *next = NULL;304 272 305 273 if (str == NULL) { 274 *next = NULL; 306 275 return NULL; 307 276 } … … 313 282 if (*str != '\0') { 314 283 *next = str + 1; 284 } else { 285 *next = NULL; 315 286 } 316 287 … … 339 310 /* Get the name part of the rest of the line. */ 340 311 strtok(line, ":"); 341 return line; 342 } 343 344 static inline const char *skip_spaces(const char *line) 312 313 /* Allocate output buffer. */ 314 size_t size = str_size(line) + 1; 315 char *name = malloc(size); 316 317 if (name != NULL) { 318 /* Copy the result to the output buffer. */ 319 str_cpy(name, size, line); 320 } 321 322 return name; 323 } 324 325 static inline char *skip_spaces(char *line) 345 326 { 346 327 /* Skip leading spaces. */ … … 351 332 } 352 333 353 static void isa_fun_ add_irq(isa_fun_t *fun, int irq)334 static void isa_fun_set_irq(isa_fun_t *fun, int irq) 354 335 { 355 336 size_t count = fun->hw_resources.count; … … 367 348 } 368 349 369 static void isa_fun_ add_dma(isa_fun_t *fun, int dma)350 static void isa_fun_set_dma(isa_fun_t *fun, int dma) 370 351 { 371 352 size_t count = fun->hw_resources.count; … … 400 381 } 401 382 402 static void isa_fun_ add_io_range(isa_fun_t *fun, size_t addr, size_t len)383 static void isa_fun_set_io_range(isa_fun_t *fun, size_t addr, size_t len) 403 384 { 404 385 size_t count = fun->hw_resources.count; … … 419 400 } 420 401 421 static void fun_parse_irq(isa_fun_t *fun, c onst char *val)402 static void fun_parse_irq(isa_fun_t *fun, char *val) 422 403 { 423 404 int irq = 0; … … 428 409 429 410 if (val != end) 430 isa_fun_add_irq(fun, irq); 431 } 432 433 static void fun_parse_dma(isa_fun_t *fun, const char *val) 434 { 411 isa_fun_set_irq(fun, irq); 412 } 413 414 static void fun_parse_dma(isa_fun_t *fun, char *val) 415 { 416 unsigned int dma = 0; 435 417 char *end = NULL; 436 418 437 419 val = skip_spaces(val); 438 const int dma =strtol(val, &end, 10);420 dma = (unsigned int) strtol(val, &end, 10); 439 421 440 422 if (val != end) 441 isa_fun_ add_dma(fun, dma);442 } 443 444 static void fun_parse_io_range(isa_fun_t *fun, c onst char *val)423 isa_fun_set_dma(fun, dma); 424 } 425 426 static void fun_parse_io_range(isa_fun_t *fun, char *val) 445 427 { 446 428 size_t addr, len; … … 459 441 return; 460 442 461 isa_fun_ add_io_range(fun, addr, len);462 } 463 464 static void get_match_id(char **id, c onst char *val)465 { 466 c onst char *end = val;443 isa_fun_set_io_range(fun, addr, len); 444 } 445 446 static void get_match_id(char **id, char *val) 447 { 448 char *end = val; 467 449 468 450 while (!isspace(*end)) … … 474 456 } 475 457 476 static void fun_parse_match_id(isa_fun_t *fun, c onst char *val)458 static void fun_parse_match_id(isa_fun_t *fun, char *val) 477 459 { 478 460 char *id = NULL; 461 int score = 0; 479 462 char *end = NULL; 463 int rc; 480 464 481 465 val = skip_spaces(val); 482 466 483 intscore = (int)strtol(val, &end, 10);467 score = (int)strtol(val, &end, 10); 484 468 if (val == end) { 485 469 ddf_msg(LVL_ERROR, "Cannot read match score for function " … … 499 483 "function %s", id, score, ddf_fun_get_name(fun->fnode)); 500 484 501 intrc = ddf_fun_add_match_id(fun->fnode, id, score);485 rc = ddf_fun_add_match_id(fun->fnode, id, score); 502 486 if (rc != EOK) { 503 487 ddf_msg(LVL_ERROR, "Failed adding match ID: %s", … … 508 492 } 509 493 510 static bool prop_parse(isa_fun_t *fun, c onst char *line, const char *prop,511 void (*read_fn)(isa_fun_t *, c onst char *))494 static bool prop_parse(isa_fun_t *fun, char *line, const char *prop, 495 void (*read_fn)(isa_fun_t *, char *)) 512 496 { 513 497 size_t proplen = str_size(prop); … … 524 508 } 525 509 526 static void fun_prop_parse(isa_fun_t *fun, c onst char *line)510 static void fun_prop_parse(isa_fun_t *fun, char *line) 527 511 { 528 512 /* Skip leading spaces. */ … … 539 523 } 540 524 525 static void fun_hw_res_alloc(isa_fun_t *fun) 526 { 527 fun->hw_resources.resources = 528 (hw_resource_t *) malloc(sizeof(hw_resource_t) * ISA_MAX_HW_RES); 529 } 530 531 static void fun_hw_res_free(isa_fun_t *fun) 532 { 533 free(fun->hw_resources.resources); 534 fun->hw_resources.resources = NULL; 535 } 536 541 537 static char *isa_fun_read_info(char *fun_conf, isa_bus_t *isa) 542 538 { 543 539 char *line; 540 char *fun_name = NULL; 544 541 545 542 /* Skip empty lines. */ 546 do{543 while (true) { 547 544 line = str_get_line(fun_conf, &fun_conf); 548 545 … … 552 549 } 553 550 554 } while (line_empty(line)); 551 if (!line_empty(line)) 552 break; 553 } 555 554 556 555 /* Get device name. */ 557 const char *fun_name = get_device_name(line);556 fun_name = get_device_name(line); 558 557 if (fun_name == NULL) 559 558 return NULL; 560 559 561 560 isa_fun_t *fun = isa_fun_create(isa, fun_name); 561 free(fun_name); 562 562 if (fun == NULL) { 563 563 return NULL; 564 564 } 565 566 /* Allocate buffer for the list of hardware resources of the device. */ 567 fun_hw_res_alloc(fun); 565 568 566 569 /* Get properties of the device (match ids, irq and io range). */ … … 593 596 } 594 597 595 static void isa_functions_add(isa_bus_t *isa) 596 { 597 char *conf = fun_conf_read(CHILD_FUN_CONF_PATH); 598 static void fun_conf_parse(char *conf, isa_bus_t *isa) 599 { 598 600 while (conf != NULL && *conf != '\0') { 599 601 conf = isa_fun_read_info(conf, isa); 600 602 } 601 free(conf); 603 } 604 605 static void isa_functions_add(isa_bus_t *isa) 606 { 607 char *fun_conf; 608 609 fun_conf = fun_conf_read(CHILD_FUN_CONF_PATH); 610 if (fun_conf != NULL) { 611 fun_conf_parse(fun_conf, isa); 612 free(fun_conf); 613 } 602 614 } 603 615 604 616 static int isa_dev_add(ddf_dev_t *dev) 605 617 { 618 isa_bus_t *isa; 619 606 620 ddf_msg(LVL_DEBUG, "isa_dev_add, device handle = %d", 607 621 (int) ddf_dev_get_handle(dev)); 608 622 609 isa _bus_t *isa= ddf_dev_data_alloc(dev, sizeof(isa_bus_t));623 isa = ddf_dev_data_alloc(dev, sizeof(isa_bus_t)); 610 624 if (isa == NULL) 611 625 return ENOMEM; … … 644 658 { 645 659 isa_bus_t *isa = isa_bus(dev); 660 int rc; 646 661 647 662 fibril_mutex_lock(&isa->mutex); … … 651 666 isa_fun_t, bus_link); 652 667 653 intrc = ddf_fun_offline(fun->fnode);668 rc = ddf_fun_offline(fun->fnode); 654 669 if (rc != EOK) { 655 670 fibril_mutex_unlock(&isa->mutex); … … 667 682 list_remove(&fun->bus_link); 668 683 684 fun_hw_res_free(fun); 669 685 ddf_fun_destroy(fun->fnode); 670 686 } … … 693 709 } 694 710 711 712 static void isa_init() 713 { 714 ddf_log_init(NAME); 715 isa_fun_ops.interfaces[HW_RES_DEV_IFACE] = &isa_fun_hw_res_ops; 716 } 717 695 718 int main(int argc, char *argv[]) 696 719 { 697 720 printf(NAME ": HelenOS ISA bus driver\n"); 698 ddf_log_init(NAME);721 isa_init(); 699 722 return ddf_driver_main(&isa_driver); 700 723 }
Note:
See TracChangeset
for help on using the changeset viewer.