hi im trying to run ivtv on an amd64- ok, the firmware loading has been fixed. used : http://kmos.org/~ckennedy/ivtv/ivtv-0.1.10-pre2-ck65f.tgz to load ivtv successfully. but the io code does not seem to be 64bit safe. when accessing the device the kernel crashes: when executing function ivtv_sched_DMA There must be someone out there who is able to check if this is 64bit safe .. ! Thanks, sven PS: if someone can tell me how to save the dmesg of a crashing kernel i will submit the stack trace On Fri, 2004-05-14 at 13:46, Sven Boeckelmann wrote: > hi, > > i'm trying to get ivtv working on my amd64. > the driver is compiling on gentoo with kernel 2.6.6, gcc 3.3.3, > module-init-tools from gentoo sys-apps/module-init-tools-3.0 > > > but when i'm doing insmod i get a modprobe Ooops: > > ivtv: i2c client attach > ivtv: i2c attach [client=saa7115[0],ok] > ivtv: Active card count: 1. > ivtv: Stopping VDM > ivtv: Stopping AO > ivtv: pinging (?) APU > ivtv: Stopping VPU > ivtv: Resetting Hw Blocks > ivtv: Stopping SPU > ivtv: Sleeping for 10ms > ivtv: init Encoder SDRAM pre-charge > ivtv: init Encoder SDRAM refresh to 1us > ivtv: init Decoder SDRAM pre-charge > ivtv: init Decoder SDRAM refresh to 1us > ivtv: Sleeping for 600ms (600 recommended) > ivtv: Card ready for firmware! > ivtv: Loading encoder image > ivtv: Loading decoder firmware > ivtv: Sleeping for 1 sec > ivtv: Sleeping for 1 sec > ivtv: About to search for mailboxes > ivtv: Searching for encoder mailbox > ivtv: .<1>Unable to handle kernel paging request at 00000000000c8100 > RIP: > <ffffffffa02ebdfb>{:ivtv:ivtv_find_firmware_mailbox+75}PML4 38949067 PGD > 386ad067 PMD 0 > Oops: 0000 [1] > CPU 0 > Pid: 5714, comm: insmod Tainted: P 2.6.6 > RIP: 0010:[<ffffffffa02ebdfb>] > <ffffffffa02ebdfb>{:ivtv:ivtv_find_firmware_mailbox+75}RSP: > 0018:0000010037529dc8 EFLAGS: 00010213 > RAX: ffffff00010c7fff RBX: 0000000000000000 RCX: 000000000000007f > RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffff80463a40 > RBP: 00000000000c8100 R08: 0000000000000034 R09: 000001003f37b0c0 > R10: 0000007fbffff3c3 R11: 0000000000000001 R12: 0000000000000000 > R13: ffffffffa02fd720 R14: 00000000005020a0 R15: 0000000000000003 > FS: 0000002a95ac9060(0000) GS:ffffffff804ce600(0000) > knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b > CR2: 00000000000c8100 CR3: 0000000000101000 CR4: 00000000000006e0 > Process insmod (pid: 5714, stackpage=1003e76f000) > Stack: 0000000000000000 ffffffffa02fd720 000001003fd15000 > 0000000000000000 > 0000000000000000 ffffffffa03056b0 0000010037529e80 > 01164000381e1aa8 > 000001003ff0c3a8 ffffffff801948b1 > Call Trace:<ffffffffa03056b0>{:ivtv:ivtv_probe+1712} > <ffffffff801948b1>{sysfs_create+113} > <ffffffff801951a3>{create_dir+131} > <ffffffff8022d3cd>{pci_device_probe_static+61} > <ffffffff8022d419>{__pci_device_probe+25} > <ffffffff8022d460>{pci_device_probe+48} > <ffffffff8028aad7>{bus_match+71} > <ffffffff8028abf6>{driver_attach+70} > <ffffffff8028ae9e>{bus_add_driver+126} > <ffffffff8028b212>{driver_register+50} > <ffffffff8022d68e>{pci_register_driver+62} > <ffffffffa02ef1ac>{:ivtv:module_start+716} > <ffffffff80148417>{sys_init_module+263} > <ffffffff8011141a>{system_call+126} > > > Code: 8b 45 00 39 04 95 70 ae 2f a0 75 54 ff c3 44 8d 65 04 8d 43 > RIP <ffffffffa02ebdfb>{:ivtv:ivtv_find_firmware_mailbox+75} RSP > <0000010037529dc8> > CR2: 00000000000c8100 > > > i was able to track it down to this portion of the code, > but i guess the ivtv code is not able to 64bit at all. > I habe been in contact with some of the ivtv developers, > but none of them use amd64. so it's hard for them to figure out > where the problem is. I was hoping someone on this list can help. > > int ivtv_find_firmware_mailbox(struct ivtv *itv) { > u32 *searchptr, *result; > int match = 0; > > searchptr = NULL; > result = NULL; > > IVTV_DEBUG(IVTV_DEBUG_INFO, "Searching for encoder mailbox\n"); > searchptr =(u32 *)(IVTV_FIRM_SEARCH_ENCODER_START + > itv->io_mem); > > while (searchptr < (u32 *)(IVTV_FIRM_SEARCH_ENCODER_END + > itv->io_mem)) { > if (ivtv_firm_search_id[match] == readl(searchptr)) { > (u32)result = (u32)searchptr+4; /* avoid pointer > aritmetic */ > match++; > while ((match > 0) && (match < 4)) { > IVTV_DEBUG(IVTV_DEBUG_INFO, "match: > 0x%08x at " > "0x%08x. match: %d\n", > *result, > (u32)result, match); > if (ivtv_firm_search_id[match] == > readl(result)) { > match++; > /* FIXME change to just > "result++;" ? */ > (u32)result = (u32)result + 4; > } > else > match = 0; > } > } > else { > IVTV_DEBUG(IVTV_DEBUG_INFO, "."); > } > if ( 4 == match ) { > IVTV_DEBUG(IVTV_DEBUG_INFO, "found encoder > mailbox!\n"); > > itv->enc_mbox = (struct ivtv_mailbox *) result; > break; > } > (u32)searchptr += IVTV_FIRM_SEARCH_STEP; > } > if (itv->enc_mbox == NULL) IVTV_DEBUG(IVTV_DEBUG_ERR, "Encoder > mailbox not found\n"); > > IVTV_DEBUG(IVTV_DEBUG_INFO, "Searching for decoder mailbox\n"); > match = 0; > searchptr = (u32 *)(IVTV_FIRM_SEARCH_DECODER_START + > itv->io_mem); > > while (searchptr < (u32 *)(IVTV_FIRM_SEARCH_DECODER_END + > itv->io_mem)) { > if (ivtv_firm_search_id[match] == readl(searchptr)) { > (u32)result = (u32)searchptr+4; /* avoid > pointer aritmetic */ match++; > while ((match > 0) && (match < 4)) { > IVTV_DEBUG(IVTV_DEBUG_INFO, "match: > 0x%08x at 0x%08x. match: %d\n", > *result, (u32)result, match); > if (ivtv_firm_search_id[match] == > readl(result)) { > match++; > /* FIXME change to just > "result++;" ? */ > (u32)result = (u32)result + 4; > } > else > match = 0; > } > } > else { > IVTV_DEBUG(IVTV_DEBUG_INFO, "."); > } > if ( 4 == match ) { > IVTV_DEBUG(IVTV_DEBUG_INFO, "found decoder > mailbox!\n"); > itv->dec_mbox = (struct ivtv_mailbox *) result; > break; > } > (u32)searchptr += IVTV_FIRM_SEARCH_STEP; > } > if (itv->dec_mbox == 0) IVTV_DEBUG(IVTV_DEBUG_ERR, "Decoder > mailbox not found\n"); > > return 0; > } > > > the first time we run into the loop everything is fine, > but after > (u32)searchptr += IVTV_FIRM_SEARCH_STEP; > is called > readl(searchptr) > causes the error. > > i did a quick hack and changed it to: > searchptr = (u32 *) (searchptr + IVTV_FIRM_SEARCH_STEP); > which eliminated the error. > > but of course id didn't make the driver work properly :-( > > no the encoder search loop works, but doesn't find a match at > if (ivtv_firm_search_id[match] == readl(searchptr)) { > > and when we start looking for the decoder there is still the same error. > > i guess there is something going wrong with ivtv->io_mem and > readl(searchptr). > > unfortunately i don't know much about pointer and address ranges. > I'm hoping to get in touch with one of the amd64 kernel gurus on this > list to help us figure out how to get ivtv running on amd64. > > I'm really stuck! > > Cheers, > Sven