static void print_sbd_config(struct sbd_link_device *sl)
{
#ifdef CONFIG_SEC_MODEM_DEBUG
	int i;

	pr_err("mif: SBD_IPC {shmem_base:0x%lX shmem_size:%d}\n",
		(unsigned long)sl->shmem, sl->shmem_size);

	pr_err("mif: SBD_IPC {version:%d num_channels:%d rbps_offset:%d}\n",
		sl->g_desc->version, sl->g_desc->num_channels,
		sl->g_desc->rbps_offset);

	for (i = 0; i < sl->num_channels; i++) {
		struct sbd_rb_channel *rb_ch = &sl->g_desc->rb_ch[i];
		struct sbd_rb_desc *rbd;

		rbd = &sl->g_desc->rb_desc[i][UL];
		pr_err("mif: RB_DESC[%-2d][UL](offset:%d) = "
			"{id:%-2d ch:%-3d dir:%s} "
			"{sbdv_offset:%-5d rb_len:%-3d} "
			"{buff_size:%-4d payload_offset:%d}\n",
			i, rb_ch->ul_rbd_offset, rbd->id, rbd->ch,
			udl_str(rbd->direction), rb_ch->ul_sbdv_offset,
			rbd->length, rbd->buff_size, rbd->payload_offset);

		rbd = &sl->g_desc->rb_desc[i][DL];
		pr_err("mif: RB_DESC[%-2d][DL](offset:%d) = "
			"{id:%-2d ch:%-3d dir:%s} "
			"{sbdv_offset:%-5d rb_len:%-3d} "
			"{buff_size:%d payload_offset:%d}\n",
			i, rb_ch->dl_rbd_offset, rbd->id, rbd->ch,
			udl_str(rbd->direction), rb_ch->dl_sbdv_offset,
			rbd->length, rbd->buff_size, rbd->payload_offset);
	}
#endif
}
Пример #2
0
static ssize_t dbgfs_frame(struct file *file,
                           char __user *user_buf, size_t count, loff_t *ppos)
{
    char *buf;
    ssize_t size;
    u32 i, dir, len = 0;
    struct mem_link_device *mld;
    struct sbd_link_device *sl;

    mld = file->private_data;
    sl = &mld->sbd_link_dev;

    if (!mld || !sl)
        return 0;

    buf = kzalloc(DEBUGFS_BUF_SIZE, GFP_KERNEL);
    if (!buf) {
        mif_err("not enough memory...\n");
        return 0;
    }

    for (i = 0; i < sl->num_channels; i++)
        for (dir = UL; dir <= DL; dir++) {
            struct sbd_ring_buffer *rb = sbd_id2rb(sl, i, dir);
            if (!rb || !sipc_major_ch(rb->ch))
                break;

            len += snprintf((buf + len), (DEBUGFS_BUF_SIZE - len),
                            ">> ch:%d len:%d size:%d [%s w:%d r:%d]\n",
                            rb->ch, rb->len, rb->buff_size,
                            udl_str(rb->dir), *rb->wp, *rb->rp);

            len += dump_rb_frame((buf + len),
                                 (DEBUGFS_BUF_SIZE - len), rb);
            len += snprintf((buf + len),
                            (DEBUGFS_BUF_SIZE - len), "\n");
        }

    len += snprintf((buf + len), (DEBUGFS_BUF_SIZE - len), "\n");

    mif_info("Total output length = %d\n", len);

    size = simple_read_from_buffer(user_buf, count, ppos, buf, len);
    kfree(buf);

    return size;
}
/**
@brief		set up an SBD RB

(1) build an SBD RB instance in the kernel space\n
(2) allocate an SBD array in SHMEM\n
(3) allocate a data buffer array in SHMEM if possible\n
*/
static int setup_sbd_rb(struct sbd_link_device *sl, struct sbd_ring_buffer *rb,
			enum direction dir, struct sbd_link_attr *link_attr)
{
	unsigned int alloc_size;
	int i;

	rb->sl = sl;

	rb->lnk_hdr = link_attr->lnk_hdr;

	rb->more = false;
	rb->total = 0;
	rb->rcvd = 0;

	/*
	Initialize an SBD RB instance in the kernel space.
	*/
	rb->id = link_attr->id;
	rb->ch = link_attr->ch;
	rb->dir = dir;
	rb->len = link_attr->rb_len[dir];
	rb->buff_size = link_attr->buff_size[dir];
	rb->payload_offset = 0;

	/*
	Prepare array of pointers to the data buffer for each SBD
	*/
	alloc_size = (rb->len * sizeof(u8 *));
	rb->buff = kmalloc(alloc_size, GFP_ATOMIC);
	if (!rb->buff)
		return -ENOMEM;

	/*
	(1) Allocate an array of data buffers in SHMEM.
	(2) Register the address of each data buffer.
	*/
	alloc_size = (rb->len * rb->buff_size);
	rb->buff_rgn = (u8 *)buff_alloc(sl, alloc_size);
	if (!rb->buff_rgn)
		return -ENOMEM;

	for (i = 0; i < rb->len; i++)
		rb->buff[i] = rb->buff_rgn + (i * rb->buff_size);

#if 0
	mif_err("RB[%d:%d][%s] buff_rgn {addr:0x%08X offset:%d size:%d}\n",
		rb->id, rb->ch, udl_str(dir), (int)rb->buff_rgn,
		calc_offset(rb->buff_rgn, sl->shmem), alloc_size);
#endif

	/*
	Prepare SBD array in SHMEM.
	*/
	rb->rp = &sl->rp[rb->dir][rb->id];
	rb->wp = &sl->wp[rb->dir][rb->id];

	alloc_size = (rb->len * sizeof(u32));

	rb->addr_v = (u32 *)desc_alloc(sl, alloc_size);
	if (!rb->addr_v)
		return -ENOMEM;

	rb->size_v = (u32 *)desc_alloc(sl, alloc_size);
	if (!rb->size_v)
		return -ENOMEM;

	/*
	Register each data buffer to the corresponding SBD.
	*/
	for (i = 0; i < rb->len; i++) {
		rb->addr_v[i] = calc_offset(rb->buff[i], sl->shmem);
		rb->size_v[i] = 0;
	}

	rb->iod = link_get_iod_with_channel(sl->ld, rb->ch);
	rb->ld = sl->ld;

	return 0;
}