VCHIQ_STATUS_T
vchiq_prepare_bulk_data(VCHIQ_BULK_T *bulk, VCHI_MEM_HANDLE_T memhandle,
	void *offset, int size, int dir)
{
	PAGELIST_T *pagelist;
	int ret;

	WARN_ON(memhandle != VCHI_MEM_HANDLE_INVALID);

	ret = create_pagelist((char __user *)offset, size,
			(dir == VCHIQ_BULK_RECEIVE)
			? PAGELIST_READ
			: PAGELIST_WRITE,
			current,
			&pagelist);
	if (ret != 0)
		return VCHIQ_ERROR;

	bulk->handle = memhandle;
	bulk->data = VCHIQ_ARM_ADDRESS(pagelist);

	/* Store the pagelist address in remote_data, which isn't used by the
	   slave. */
	bulk->remote_data = pagelist;

	return VCHIQ_SUCCESS;
}
Beispiel #2
0
VCHIQ_STATUS_T
vchiq_prepare_bulk_data(VCHIQ_BULK_T *bulk, VCHI_MEM_HANDLE_T memhandle,
                        void *offset, int size, int dir)
{
    PAGELIST_T *pagelist;
    BULKINFO_T *bi;
    int ret;

    WARN_ON(memhandle != VCHI_MEM_HANDLE_INVALID);
    bi = malloc(sizeof(*bi), M_VCPAGELIST, M_WAITOK | M_ZERO);
    if (bi == NULL)
        return VCHIQ_ERROR;

    ret = create_pagelist((char __user *)offset, size,
                          (dir == VCHIQ_BULK_RECEIVE)
                          ? PAGELIST_READ
                          : PAGELIST_WRITE,
                          current,
                          bi);
    if (ret != 0)
        return VCHIQ_ERROR;

    bulk->handle = memhandle;
    bulk->data = VCHIQ_ARM_ADDRESS(bi->pagelist);

    /* Store the pagelist address in remote_data, which isn't used by the
       slave. */
    bulk->remote_data = bi;

    return VCHIQ_SUCCESS;
}