[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 1/5] cdi: Verwaltung von Speicherbereichen



On Sat, Feb 13 22:12, Kevin Wolf wrote:
> + cdi: Neuer Header mem.h, der Funktionen zur Verwaltung von
>   Speicherbereichen enthaelt
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/modules/cdi/include/cdi-osdep.h |   11 ++
>  src/modules/cdi/include/cdi/mem.h   |  255 +++++++++++++++++++++++++++++++++++
>  2 files changed, 266 insertions(+), 0 deletions(-)
>  create mode 100644 src/modules/cdi/include/cdi/mem.h
> 
> diff --git a/src/modules/cdi/include/cdi-osdep.h b/src/modules/cdi/include/cdi-osdep.h
> index 6187c32..0d052fe 100644
> --- a/src/modules/cdi/include/cdi-osdep.h
> +++ b/src/modules/cdi/include/cdi-osdep.h
> @@ -68,4 +68,15 @@ typedef struct
>      FILE* file;
>  } cdi_dma_osdep;
>  
> +/**
> + * \german
> + * OS-spezifische Daten fuer Speicherbereiche
> + * \endgerman
> + * \english
> + * OS-specific data for memory areas.
> + * \endenglish
> + */
> +typedef struct {
> +} cdi_mem_osdep;
> +
>  #endif
> diff --git a/src/modules/cdi/include/cdi/mem.h b/src/modules/cdi/include/cdi/mem.h
> new file mode 100644
> index 0000000..08837f7
> --- /dev/null
> +++ b/src/modules/cdi/include/cdi/mem.h
> @@ -0,0 +1,255 @@
> +/*
> + * Copyright (c) 2010 Kevin Wolf
> + *
> + * This program is free software. It comes without any warranty, to
> + * the extent permitted by applicable law. You can redistribute it
> + * and/or modify it under the terms of the Do What The Fuck You Want
> + * To Public License, Version 2, as published by Sam Hocevar. See
> + * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
> + */
> +
> +#ifndef _CDI_MEM_H_
> +#define _CDI_MEM_H_
> +
> +#include <stdint.h>
> +#include "cdi.h"
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +/**
> + * \german
> + * Beschreibt Anforderungen an einen Speicherbereich
> + * \endgerman
> + * \english
> + * Describes requirements for a memory area
> + * \endenglish
> + */
> +typedef enum {
> +    /**
> +     * \german
> +     * Maske fuer ein Bitfeld, das das benoetige physische Alignment beschreibt
> +     * (das geforderte Alignment ist 2^x Bytes)
> +     * \endgerman
> +     * \english
> +     * Mask for a bit field which describes the required physical alignment
> +     * (the required alignment is 2^x bytes)
> +     * \endenglish
> +     */
> +    CDI_MEM_ALIGN_MASK      = 0x1f,
> +
> +    /**
> +     * \german
> +     * Physische Adresse muss nicht gueltig sein
> +     * \endgerman
> +     * \english
> +     * Physical address isn't required to be valid
> +     * \endenglish
> +     */
> +    CDI_MEM_VIRT_ONLY       = 0x20,
> +
> +    /**
> +     * \german
> +     * Physisch zusammenh??ngenden Speicher anfordern
> +     * \endgerman
> +     * \english
> +     * Request physically contiguous memory
> +     * \endenglish
> +     */
> +    CDI_MEM_PHYS_CONTIGUOUS = 0x40,
> +
> +    /**
> +     * \german
> +     * Physischen Speicher < 16 MB anfordern
> +     * \endgerman
> +     * \english
> +     * Request physical memory < 16 MB
> +     * \endenglish
> +     */
> +    CDI_MEM_DMA_16M         = 0x80,
> +
> +    /**
> +     * \german
> +     * Physischen Speicher < 4 GB anfordern
> +     * \endgerman
> +     * \english
> +     * Request physical memory < 4 GB
> +     * \endenglish
> +     */
> +    CDI_MEM_DMA_4G          = 0x100,
> +
> +    /**
> +     * \german
> +     * Speicher muss nicht initialisiert werden (verhindert Kopie bei
> +     * cdi_mem_require_flags)
> +     * \endgerman
> +     * \english
> +     * Memory doesn't need to be initialised (avoids copy in
> +     * cdi_mem_require_flags)
> +     * \endenglish
> +     */
> +    CDI_MEM_NOINIT          = 0x200,
> +} cdi_mem_flags_t;
> +
> +/**
> + * \german
> + * Beschreibt einen physischen Speicherberich (Eintrag einer
> + * Scatter/Gather-Liste)
> + * \endgerman
> + * \english
> + * Describes an area of physical memory (an entry for a scatter/gather list)
> + * \endenglish
> + */
> +struct cdi_mem_sg_item {
> +    uintptr_t   start;
> +    size_t      size;
> +};
> +
> +/**
> + * \german
> + * Scatter/Gather-Liste, die die physischen Adressen zu einem bestimmten
> + * virtuellen Speicherbereich enth??lt.
> + * \endgerman
> + * \english
> + * Scatter/Gather list which contains the physical addresses for a given area
> + * of virtual memory.
> + * \endenglish
> + */
> +struct cdi_mem_sg_list {
> +    size_t                  num;
> +    struct cdi_mem_sg_item* items;
> +};
> +
> +/**
> + * \german
> + * Beschreibt einen virtuellen Speicherbereich, je nach Flags mit einer
> + * Scatter/Gather-Liste der zugeh??rigen phyischen Adressen.
> + * \endgerman
> + * \english
> + * Describes an area of virtual memory, depending on the allocation flags with
> + * a scatter/gather list of its physical addresses.
> + * \endenglish
> + */
> +struct cdi_mem_area {
> +    size_t                  size;
> +    void*                   vaddr;
> +    struct cdi_mem_sg_list  paddr;
> +
> +    cdi_mem_osdep           osdep;
> +};
> +
> +/**
> + * \german
> + * Reserviert einen Speicherbereich.
> + *
> + * @param size Gr????e des Speicherbereichs in Bytes
> + * @param flags Flags, die zus??tzliche Anforderungen beschreiben
> + *
> + * @return Eine cdi_mem_area bei Erfolg, NULL im Fehlerfall
> + * \endgerman
> + * \english
> + * Allocates a memory area.
> + *
> + * @param size Size of the memory area in bytes
> + * @param flags Flags that describe additional requirements
> + *
> + * @return A cdi_mem_area on success, NULL on failure
> + * \endenglish
> + */
> +struct cdi_mem_area* cdi_mem_alloc(size_t size, cdi_mem_flags_t flags);
> +
> +/**
> + * \german
> + * Reserviert physisch zusammenh??genden Speicher an einer definierten Adresse
> + *
> + * @param paddr Physische Adresse des angeforderten Speicherbereichs
> + * @param size Gr????e des ben??tigten Speichers in Bytes
> + *
> + * @return Eine cdi_mem_area bei Erfolg, NULL im Fehlerfall
> + * \endgerman
> + * \english
> + * Reserves physically contiguous memory at a defined address
> + *
> + * @param paddr Physical address of the requested memory aread

KRITIKEL                                                    ^^^^^

> + * @param size Size of the requested memory area in bytes
> + *
> + * @return A cdi_mem_area on success, NULL on failure
> + * \endenglish
> + */
> +struct cdi_mem_area* cdi_mem_map(uintptr_t paddr, size_t size);
> +
> +/**
> + * \german
> + * Gibt einen durch cdi_mem_alloc oder cdi_mem_map reservierten Speicherbereich
> + * frei
> + * \endgerman
> + * \english
> + * Frees a memory area that was previously allocated by cdi_mem_alloc or
> + * cdi_mem_map
> + * \endenglish
> + */
> +void cdi_mem_free(struct cdi_mem_area* p);
> +
> +/**
> + * \german
> + * Gibt einen Speicherbereich zur??ck, der dieselben Daten wie @a p beschreibt,
> + * aber mindestens die gegebenen Flags gesetzt hat.
> + *
> + * Diese Funktion kann denselben virtuellen und physischen Speicherbereich wie
> + * @p benutzen oder sogar @p selbst zur??ckzugeben, solange der gemeinsam
> + * benutzte Speicher erst dann freigegeben wird, wenn sowohl @a p als auch der
> + * R??ckgabewert durch cdi_mem_free freigegeben worden sind.
> + *
> + * Ansonsten wird ein neuer Speicherbereich reserviert und (au??er wenn das
> + * Flag CDI_MEM_NOINIT gesetzt ist) die Daten werden aus @a p in den neu
> + * reservierten Speicher kopiert.
> + * \endgerman
> + * \english
> + * Returns a memory area that describes the same data as @a p does, but for
> + * which at least the given flags are set.
> + *
> + * This function may use the same virtual and physical memory areas as used in
> + * @a p, or it may even return @a p itself. In this case it must ensure that
> + * the commonly used memory is only freed when both @a p and the return value
> + * of this function have been freed by cdi_mem_free.
> + *
> + * Otherwise, a new memory area is allocated and data is copied from @a p into
> + * the newly allocated memory (unless CDI_MEM_NOINIT is set).
> + * \endenglish
> + */
> +struct cdi_mem_area* cdi_mem_require_flags(struct cdi_mem_area* p,
> +    cdi_mem_flags_t flags);
> +
> +/**
> + * \german
> + * Kopiert die Daten von @a src nach @a dest. Beide Speicherbereiche m??ssen
> + * gleich gro?? sein.
> + *
> + * Das bedeutet nicht unbedingt eine physische Kopie: Wenn beide
> + * Speicherbereiche auf denselben physischen Speicher zeigen, macht diese
> + * Funktion nichts. Sie kann auch andere Methoden verwenden, um den Speicher
> + * effektiv zu kopieren, z.B. durch geeignetes Ummappen von Pages.
> + *
> + * @return 0 bei Erfolg, -1 sonst
> + * \endgerman
> + * \english
> + * Copies data from @a src to @a dest. Both memory areas must be of the same
> + * size.
> + *
> + * This does not necessarily involve a physical copy: If both memory areas
> + * point to the same physical memory, this function does nothing. It can also
> + * use other methods to achieve the same visible effect, e.g. by remapping
> + * pages.
> + *
> + * @return 0 on success, -1 otherwise
> + * \endenglish
> + */
> +int cdi_mem_copy(struct cdi_mem_area* dest, struct cdi_mem_area* src);
> +
> +#ifdef __cplusplus
> +}; // extern "C"
> +#endif
> +
> +#endif
> +

Abgesehen vom Kritikel oben sieht das gut aus. ;-)

Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgp16U40epygQ.pgp
Description: PGP signature