static void sti_inq_conf(struct sti_struct *sti) { struct sti_conf_inptr inptr = { 0, }; unsigned long flags; s32 ret; sti->outptr.ext_ptr = STI_PTR(&sti->outptr_ext); do { spin_lock_irqsave(&sti->lock, flags); ret = STI_CALL(sti->inq_conf, &default_conf_flags, &inptr, &sti->outptr, sti->glob_cfg); spin_unlock_irqrestore(&sti->lock, flags); } while (ret == 1); }
static void sti_init_graph(struct sti_struct *sti) { struct sti_init_inptr_ext inptr_ext = { 0, { 0 }, 0, NULL }; struct sti_init_inptr inptr = { 3, STI_PTR(&inptr_ext) }; struct sti_init_outptr outptr = { 0 }; unsigned long flags; s32 ret; spin_lock_irqsave(&sti->lock, flags); ret = STI_CALL(sti->init_graph, &default_init_flags, &inptr, &outptr, sti->glob_cfg); spin_unlock_irqrestore(&sti->lock, flags); sti->text_planes = outptr.text_planes; }
static int __init sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address, unsigned long hpa) { struct sti_glob_cfg *glob_cfg; struct sti_glob_cfg_ext *glob_cfg_ext; void *save_addr; void *sti_mem_addr; const int save_addr_size = 1024; /* XXX */ int i; if (!sti->sti_mem_request) sti->sti_mem_request = 256; /* STI default */ glob_cfg = kzalloc(sizeof(*sti->glob_cfg), GFP_KERNEL); glob_cfg_ext = kzalloc(sizeof(*glob_cfg_ext), GFP_KERNEL); save_addr = kzalloc(save_addr_size, GFP_KERNEL); sti_mem_addr = kzalloc(sti->sti_mem_request, GFP_KERNEL); if (!(glob_cfg && glob_cfg_ext && save_addr && sti_mem_addr)) { kfree(glob_cfg); kfree(glob_cfg_ext); kfree(save_addr); kfree(sti_mem_addr); return -ENOMEM; } glob_cfg->ext_ptr = STI_PTR(glob_cfg_ext); glob_cfg->save_addr = STI_PTR(save_addr); for (i=0; i<8; i++) { unsigned long newhpa, len; if (sti->pd) { unsigned char offs = sti->rm_entry[i]; if (offs == 0) continue; if (offs != PCI_ROM_ADDRESS && (offs < PCI_BASE_ADDRESS_0 || offs > PCI_BASE_ADDRESS_5)) { printk (KERN_WARNING "STI pci region maping for region %d (%02x) can't be mapped\n", i,sti->rm_entry[i]); continue; } newhpa = pci_resource_start (sti->pd, (offs - PCI_BASE_ADDRESS_0) / 4); } else newhpa = (i == 0) ? rom_address : hpa; sti->regions_phys[i] = REGION_OFFSET_TO_PHYS(sti->regions[i], newhpa); len = sti->regions[i].region_desc.length * 4096; if (len) glob_cfg->region_ptrs[i] = sti->regions_phys[i]; DPRINTK(("region #%d: phys %08lx, region_ptr %08x, len=%lukB, " "btlb=%d, sysonly=%d, cache=%d, last=%d\n", i, sti->regions_phys[i], glob_cfg->region_ptrs[i], len/1024, sti->regions[i].region_desc.btlb, sti->regions[i].region_desc.sys_only, sti->regions[i].region_desc.cache, sti->regions[i].region_desc.last)); /* last entry reached ? */ if (sti->regions[i].region_desc.last) break; } if (++i<8 && sti->regions[i].region) printk(KERN_WARNING "%s: *future ptr (0x%8x) not yet supported !\n", __FILE__, sti->regions[i].region); glob_cfg_ext->sti_mem_addr = STI_PTR(sti_mem_addr); sti->glob_cfg = glob_cfg; return 0; }