genode/repos/base/include/pd_session/connection.h
Norman Feske e4f62380d7 base: Pd_session::dma_addr, Pd_session::attach_dma
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
2022-02-15 10:16:52 +01:00

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_ */