static int __init ps3_register_ramdisk_device(void) { int result; struct layout { struct ps3_system_bus_device dev; } *p; pr_debug(" -> %s:%d\n", __func__, __LINE__); p = kzalloc(sizeof(struct layout), GFP_KERNEL); if (!p) return -ENOMEM; p->dev.match_id = PS3_MATCH_ID_GPU; p->dev.match_sub_id = PS3_MATCH_SUB_ID_GPU_RAMDISK; p->dev.dev_type = PS3_DEVICE_TYPE_IOC0; result = ps3_system_bus_device_register(&p->dev); if (result) { pr_debug("%s:%d ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_device_register; } pr_debug(" <- %s:%d\n", __func__, __LINE__); return 0; fail_device_register: kfree(p); pr_debug(" <- %s:%d failed\n", __func__, __LINE__); return result; }
static int __init ps3_setup_vuart_device(enum ps3_match_id match_id, unsigned int port_number) { int result; struct layout { struct ps3_system_bus_device dev; } *p; pr_debug(" -> %s:%d: match_id %u, port %u\n", __func__, __LINE__, match_id, port_number); p = kzalloc(sizeof(struct layout), GFP_KERNEL); if (!p) return -ENOMEM; p->dev.match_id = match_id; p->dev.dev_type = PS3_DEVICE_TYPE_VUART; p->dev.port_number = port_number; result = ps3_system_bus_device_register(&p->dev); if (result) { pr_debug("%s:%d ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_device_register; } pr_debug(" <- %s:%d\n", __func__, __LINE__); return 0; fail_device_register: kfree(p); pr_debug(" <- %s:%d fail\n", __func__, __LINE__); return result; }
static int __init ps3_register_sound_devices(void) { int result; struct layout { struct ps3_system_bus_device dev; struct ps3_dma_region d_region; struct ps3_mmio_region m_region; } *p; pr_debug(" -> %s:%d\n", __func__, __LINE__); p = kzalloc(sizeof(*p), GFP_KERNEL); if (!p) return -ENOMEM; p->dev.match_id = PS3_MATCH_ID_SOUND; p->dev.dev_type = PS3_DEVICE_TYPE_IOC0; p->dev.d_region = &p->d_region; p->dev.m_region = &p->m_region; result = ps3_system_bus_device_register(&p->dev); if (result) { pr_debug("%s:%d ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_device_register; } pr_debug(" <- %s:%d\n", __func__, __LINE__); return 0; fail_device_register: kfree(p); pr_debug(" <- %s:%d failed\n", __func__, __LINE__); return result; }
static int __init ps3_register_graphics_devices(void) { int result; struct layout { struct ps3_system_bus_device dev; } *p; pr_debug(" -> %s:%d\n", __func__, __LINE__); p = kzalloc(sizeof(struct layout), GFP_KERNEL); if (!p) return -ENOMEM; p->dev.match_id = PS3_MATCH_ID_GRAPHICS; p->dev.dev_type = PS3_DEVICE_TYPE_IOC0; result = ps3_system_bus_device_register(&p->dev); if (result) pr_debug("%s:%d ps3_system_bus_device_register failed\n", __func__, __LINE__); pr_debug(" <- %s:%d\n", __func__, __LINE__); return result; }
static int __init ps3_register_lpm_devices(void) { int result; u64 tmp1; u64 tmp2; struct ps3_system_bus_device *dev; pr_debug(" -> %s:%d\n", __func__, __LINE__); dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) return -ENOMEM; dev->match_id = PS3_MATCH_ID_LPM; dev->dev_type = PS3_DEVICE_TYPE_LPM; /* The current lpm driver only supports a single BE processor. */ result = ps3_repository_read_be_node_id(0, &dev->lpm.node_id); if (result) { pr_debug("%s:%d: ps3_repository_read_be_node_id failed \n", __func__, __LINE__); goto fail_read_repo; } result = ps3_repository_read_lpm_privileges(dev->lpm.node_id, &tmp1, &dev->lpm.rights); if (result) { pr_debug("%s:%d: ps3_repository_read_lpm_privleges failed \n", __func__, __LINE__); goto fail_read_repo; } lv1_get_logical_partition_id(&tmp2); if (tmp1 != tmp2) { pr_debug("%s:%d: wrong lpar\n", __func__, __LINE__); result = -ENODEV; goto fail_rights; } if (!(dev->lpm.rights & PS3_LPM_RIGHTS_USE_LPM)) { pr_debug("%s:%d: don't have rights to use lpm\n", __func__, __LINE__); result = -EPERM; goto fail_rights; } pr_debug("%s:%d: pu_id %llu, rights %llu(%llxh)\n", __func__, __LINE__, dev->lpm.pu_id, dev->lpm.rights, dev->lpm.rights); result = ps3_repository_read_pu_id(0, &dev->lpm.pu_id); if (result) { pr_debug("%s:%d: ps3_repository_read_pu_id failed \n", __func__, __LINE__); goto fail_read_repo; } result = ps3_system_bus_device_register(dev); if (result) { pr_debug("%s:%d ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_register; } pr_debug(" <- %s:%d\n", __func__, __LINE__); return 0; fail_register: fail_rights: fail_read_repo: kfree(dev); pr_debug(" <- %s:%d: failed\n", __func__, __LINE__); return result; }
static int ps3_setup_storage_dev(const struct ps3_repository_device *repo, enum ps3_match_id match_id) { int result; struct ps3_storage_device *p; u64 port, blk_size, num_blocks; unsigned int num_regions, i; pr_debug(" -> %s:%u: match_id %u\n", __func__, __LINE__, match_id); result = ps3_repository_read_stor_dev_info(repo->bus_index, repo->dev_index, &port, &blk_size, &num_blocks, &num_regions); if (result) { printk(KERN_ERR "%s:%u: _read_stor_dev_info failed %d\n", __func__, __LINE__, result); return -ENODEV; } pr_debug("%s:%u: (%u:%u:%u): port %llu blk_size %llu num_blocks %llu " "num_regions %u\n", __func__, __LINE__, repo->bus_index, repo->dev_index, repo->dev_type, port, blk_size, num_blocks, num_regions); p = kzalloc(sizeof(struct ps3_storage_device) + num_regions * sizeof(struct ps3_storage_region), GFP_KERNEL); if (!p) { result = -ENOMEM; goto fail_malloc; } p->sbd.match_id = match_id; p->sbd.dev_type = PS3_DEVICE_TYPE_SB; p->sbd.bus_id = repo->bus_id; p->sbd.dev_id = repo->dev_id; p->sbd.d_region = &p->dma_region; p->blk_size = blk_size; p->num_regions = num_regions; result = ps3_repository_find_interrupt(repo, PS3_INTERRUPT_TYPE_EVENT_PORT, &p->sbd.interrupt_id); if (result) { printk(KERN_ERR "%s:%u: find_interrupt failed %d\n", __func__, __LINE__, result); result = -ENODEV; goto fail_find_interrupt; } for (i = 0; i < num_regions; i++) { unsigned int id; u64 start, size; result = ps3_repository_read_stor_dev_region(repo->bus_index, repo->dev_index, i, &id, &start, &size); if (result) { printk(KERN_ERR "%s:%u: read_stor_dev_region failed %d\n", __func__, __LINE__, result); result = -ENODEV; goto fail_read_region; } pr_debug("%s:%u: region %u: id %u start %llu size %llu\n", __func__, __LINE__, i, id, start, size); p->regions[i].id = id; p->regions[i].start = start; p->regions[i].size = size; } result = ps3_system_bus_device_register(&p->sbd); if (result) { pr_debug("%s:%u ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_device_register; } pr_debug(" <- %s:%u\n", __func__, __LINE__); return 0; fail_device_register: fail_read_region: fail_find_interrupt: kfree(p); fail_malloc: pr_debug(" <- %s:%u: fail.\n", __func__, __LINE__); return result; }
static int __ref ps3_setup_uhc_device( const struct ps3_repository_device *repo, enum ps3_match_id match_id, enum ps3_interrupt_type interrupt_type, enum ps3_reg_type reg_type) { int result; struct layout { struct ps3_system_bus_device dev; struct ps3_dma_region d_region; struct ps3_mmio_region m_region; } *p; u64 bus_addr; u64 len; pr_debug(" -> %s:%d\n", __func__, __LINE__); BUG_ON(repo->bus_type != PS3_BUS_TYPE_SB); BUG_ON(repo->dev_type != PS3_DEV_TYPE_SB_USB); p = kzalloc(sizeof(struct layout), GFP_KERNEL); if (!p) { result = -ENOMEM; goto fail_malloc; } p->dev.match_id = match_id; p->dev.dev_type = PS3_DEVICE_TYPE_SB; p->dev.bus_id = repo->bus_id; p->dev.dev_id = repo->dev_id; p->dev.d_region = &p->d_region; p->dev.m_region = &p->m_region; result = ps3_repository_find_interrupt(repo, interrupt_type, &p->dev.interrupt_id); if (result) { pr_debug("%s:%d ps3_repository_find_interrupt failed\n", __func__, __LINE__); goto fail_find_interrupt; } result = ps3_repository_find_reg(repo, reg_type, &bus_addr, &len); if (result) { pr_debug("%s:%d ps3_repository_find_reg failed\n", __func__, __LINE__); goto fail_find_reg; } result = ps3_dma_region_init(&p->dev, p->dev.d_region, PS3_DMA_64K, PS3_DMA_INTERNAL, NULL, 0); if (result) { pr_debug("%s:%d ps3_dma_region_init failed\n", __func__, __LINE__); goto fail_dma_init; } result = ps3_mmio_region_init(&p->dev, p->dev.m_region, bus_addr, len, PS3_MMIO_4K); if (result) { pr_debug("%s:%d ps3_mmio_region_init failed\n", __func__, __LINE__); goto fail_mmio_init; } result = ps3_system_bus_device_register(&p->dev); if (result) { pr_debug("%s:%d ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_device_register; } pr_debug(" <- %s:%d\n", __func__, __LINE__); return result; fail_device_register: fail_mmio_init: fail_dma_init: fail_find_reg: fail_find_interrupt: kfree(p); fail_malloc: pr_debug(" <- %s:%d: fail.\n", __func__, __LINE__); return result; }
static int __init ps3_setup_gelic_device( const struct ps3_repository_device *repo) { int result; struct layout { struct ps3_system_bus_device dev; struct ps3_dma_region d_region; } *p; pr_debug(" -> %s:%d\n", __func__, __LINE__); BUG_ON(repo->bus_type != PS3_BUS_TYPE_SB); BUG_ON(repo->dev_type != PS3_DEV_TYPE_SB_GELIC); p = kzalloc(sizeof(struct layout), GFP_KERNEL); if (!p) { result = -ENOMEM; goto fail_malloc; } p->dev.match_id = PS3_MATCH_ID_GELIC; p->dev.dev_type = PS3_DEVICE_TYPE_SB; p->dev.bus_id = repo->bus_id; p->dev.dev_id = repo->dev_id; p->dev.d_region = &p->d_region; result = ps3_repository_find_interrupt(repo, PS3_INTERRUPT_TYPE_EVENT_PORT, &p->dev.interrupt_id); if (result) { pr_debug("%s:%d ps3_repository_find_interrupt failed\n", __func__, __LINE__); goto fail_find_interrupt; } BUG_ON(p->dev.interrupt_id != 0); result = ps3_dma_region_init(&p->dev, p->dev.d_region, PS3_DMA_64K, PS3_DMA_OTHER, NULL, 0); if (result) { pr_debug("%s:%d ps3_dma_region_init failed\n", __func__, __LINE__); goto fail_dma_init; } result = ps3_system_bus_device_register(&p->dev); if (result) { pr_debug("%s:%d ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_device_register; } pr_debug(" <- %s:%d\n", __func__, __LINE__); return result; fail_device_register: fail_dma_init: fail_find_interrupt: kfree(p); fail_malloc: pr_debug(" <- %s:%d: fail.\n", __func__, __LINE__); return result; }