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 }
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; }