mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-27 17:18:53 +00:00
e4f62380d7
This patch enhances the PD-session interface with the support needed for user-level device drivers performing DMA. Both RPC functions are intended for the direct use by the platform driver only. If invoked for PDs that lack the managing-system role, the operations have no effect. The 'dma_addr()' RPC function allows the platform driver to request the DMA address of a given RAM dataspace. It is meant to replace the 'Dataspace::phys_addr' RPC function. The 'attach_dma' RPC function adds the given dataspace to the device PD's I/O page table. It replaces the former heuristics of marking DMA buffers as uncached RAM on x86. With this patch, the UNCACHED attribute of RAM dataspaces is no longer used to distinguish DMA buffers from regular RAM dataspaces. Issue #2243
58 lines
1.6 KiB
C++
58 lines
1.6 KiB
C++
/*
|
|
* \brief Connection to PD service
|
|
* \author Norman Feske
|
|
* \date 2008-08-22
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2008-2017 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU Affero General Public License version 3.
|
|
*/
|
|
|
|
#ifndef _INCLUDE__PD_SESSION__CONNECTION_H_
|
|
#define _INCLUDE__PD_SESSION__CONNECTION_H_
|
|
|
|
#include <pd_session/client.h>
|
|
#include <base/connection.h>
|
|
|
|
namespace Genode { struct Pd_connection; }
|
|
|
|
|
|
struct Genode::Pd_connection : Connection<Pd_session>, Pd_session_client
|
|
{
|
|
enum { RAM_QUOTA = 24*1024*sizeof(long)};
|
|
enum Virt_space { UNCONSTRAIN = 0, CONSTRAIN = 1 };
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* \param label session label
|
|
*/
|
|
Pd_connection(Env &env, char const *label = "", Virt_space space = CONSTRAIN)
|
|
:
|
|
Connection<Pd_session>(env, session(env.parent(),
|
|
"ram_quota=%u, cap_quota=%u, label=\"%s\", virt_space=%u",
|
|
RAM_QUOTA, CAP_QUOTA, label, space)),
|
|
Pd_session_client(cap())
|
|
{ }
|
|
|
|
struct Device_pd { };
|
|
|
|
/**
|
|
* Constructor used for creating device protection domains
|
|
*/
|
|
Pd_connection(Env &env, Device_pd)
|
|
:
|
|
Connection<Pd_session>(env, session(env.parent(),
|
|
"ram_quota=%u, cap_quota=%u, "
|
|
"label=\"device PD\", virt_space=%u, "
|
|
"managing_system=yes",
|
|
RAM_QUOTA, CAP_QUOTA, UNCONSTRAIN)),
|
|
Pd_session_client(cap())
|
|
{ }
|
|
};
|
|
|
|
#endif /* _INCLUDE__PD_SESSION__CONNECTION_H_ */
|