コード例 #1
0
ファイル: davinci_cpdma.c プロジェクト: AiWinters/linux
static void __cpdma_chan_submit(struct cpdma_chan *chan,
				struct cpdma_desc __iomem *desc)
{
	struct cpdma_ctlr		*ctlr = chan->ctlr;
	struct cpdma_desc __iomem	*prev = chan->tail;
	struct cpdma_desc_pool		*pool = ctlr->pool;
	dma_addr_t			desc_dma;
	u32				mode;

	desc_dma = desc_phys(pool, desc);

	/* simple case - idle channel */
	if (!chan->head) {
		chan->stats.head_enqueue++;
		chan->head = desc;
		chan->tail = desc;
		if (chan->state == CPDMA_STATE_ACTIVE)
			chan_write(chan, hdp, desc_dma);
		return;
	}

	/* first chain the descriptor at the tail of the list */
	desc_write(prev, hw_next, desc_dma);
	chan->tail = desc;
	chan->stats.tail_enqueue++;

	/* next check if EOQ has been triggered already */
	mode = desc_read(prev, hw_mode);
	if (((mode & (CPDMA_DESC_EOQ | CPDMA_DESC_OWNER)) == CPDMA_DESC_EOQ) &&
	    (chan->state == CPDMA_STATE_ACTIVE)) {
		desc_write(prev, hw_mode, mode & ~CPDMA_DESC_EOQ);
		chan_write(chan, hdp, desc_dma);
		chan->stats.misqueued++;
	}
}
コード例 #2
0
int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data,
		      int len, gfp_t gfp_mask)
{
	struct cpdma_ctlr		*ctlr = chan->ctlr;
	struct cpdma_desc __iomem	*desc;
	dma_addr_t			buffer;
	unsigned long			flags;
	u32				mode;
	int				ret = 0;
	bool                            is_rx;

	spin_lock_irqsave(&chan->lock, flags);

	if (chan->state == CPDMA_STATE_TEARDOWN) {
		ret = -EINVAL;
		goto unlock_ret;
	}

	is_rx = (chan->rxfree != 0);
	desc = cpdma_desc_alloc(ctlr->pool, 1, is_rx);
	if (!desc) {
		chan->stats.desc_alloc_fail++;
		ret = -ENOMEM;
		goto unlock_ret;
	}

	if (len < ctlr->params.min_packet_size) {
		len = ctlr->params.min_packet_size;
		chan->stats.runt_transmit_buff++;
	}

	buffer = dma_map_single(ctlr->dev, data, len, chan->dir);
	mode = CPDMA_DESC_OWNER | CPDMA_DESC_SOP | CPDMA_DESC_EOP;

	desc_write(desc, hw_next,   0);
	desc_write(desc, sw_next,   0);
	desc_write(desc, hw_buffer, buffer);
	desc_write(desc, hw_len,    len);
	desc_write(desc, hw_mode,   mode | len);
	desc_write(desc, sw_token,  token);
	desc_write(desc, sw_buffer, buffer);
	desc_write(desc, sw_len,    len);

	__cpdma_chan_submit(chan, desc);

	if (chan->state == CPDMA_STATE_ACTIVE && chan->rxfree)
		chan_write(chan, rxfree, 1);

	chan->count++;

unlock_ret:
	spin_unlock_irqrestore(&chan->lock, flags);
	return ret;
}
コード例 #3
0
static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg,
							void *user_data)
{
	struct descriptor *desc = user_data;
	DBusMessageIter iter;

	dbus_message_iter_init(msg, &iter);

	desc_write(desc, &iter);

	return dbus_message_new_method_return(msg);
}
コード例 #4
0
static void desc_set_value(const GDBusPropertyTable *property,
				DBusMessageIter *iter,
				GDBusPendingPropertySet id, void *user_data)
{
	struct descriptor *desc = user_data;

	printf("Descriptor(%s): Set(\"Value\", ...)\n", desc->uuid);

	desc_write(desc, iter);

	g_dbus_pending_property_success(id);
}
コード例 #5
0
ファイル: rocker_desc.c プロジェクト: PKUCloud/smc-qemu
static bool __desc_ring_post_desc(DescRing *ring, int err)
{
    uint16_t comp_err = 0x8000 | (uint16_t)-err;
    DescInfo *info = &ring->info[ring->tail];

    info->desc.comp_err = cpu_to_le16(comp_err);
    desc_write(ring, ring->tail);
    ring->tail = (ring->tail + 1) % ring->size;

    /* return true if starting credit count */

    return ring->credits++ == 0;
}
コード例 #6
0
ファイル: dspdesc.c プロジェクト: medmatix/ggobi
GtkWidget *
create_dspdesc_window(ggobid *gg, PluginInstance *inst)
{
  GtkWidget *window, *hb, *label, *entry;
  GtkTooltips *tips = gtk_tooltips_new ();
  dspdescd *desc = dspdescFromInst (inst); 

  window = gtk_file_chooser_dialog_new("Save display description", NULL, 
  	GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, 
	GTK_STOCK_CLOSE, GTK_RESPONSE_REJECT, NULL);
	
  desc->window = window;

  /* label and entry widget for main title */
  hb = gtk_hbox_new (false, 1);
  
  label = gtk_label_new_with_mnemonic ("Figure _title: ");
  gtk_box_pack_start (GTK_BOX (hb), label, false, false, 2);

  entry = gtk_entry_new ();
  gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
  g_object_set_data(G_OBJECT(window), "TITLE", entry);
  gtk_tooltips_set_tip (GTK_TOOLTIPS (tips), entry,
    "Type in the figure title", NULL);
  gtk_box_pack_start (GTK_BOX (hb), entry, true, true, 2);
  gtk_widget_show_all(hb);
  
  gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(window), hb);
	
  if (gtk_dialog_run(GTK_DIALOG(window)) == GTK_RESPONSE_ACCEPT)
	desc_write(inst);
	
  plugin_destroy(inst);
	
  return(window);
}