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

Re: [tyndur-devel] [PATCH 4/5] cdi: cdi_alloc_phys_mem/addr ersetzen



On Sat, Feb 13 22:12, Kevin Wolf wrote:
> * cdi: In allen Treibern cdi_alloc_phys_mem durch cdi_mem_alloc ersetzen
> * cdi: In allen Treibern cdi_alloc_phys_addr durch cdi_mem_map ersetzen
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/modules/cdi/ata/device.c              |   16 ++++++--
>  src/modules/cdi/ata/device.h              |    4 +-
>  src/modules/cdi/ata/request.c             |    2 +-
>  src/modules/cdi/e1000/device.c            |   19 ++++++---
>  src/modules/cdi/e1000/device.h            |    2 +-
>  src/modules/cdi/ne2k/include/ne2k.h       |    4 +-
>  src/modules/cdi/ne2k/ne2k.c               |   13 +++++-
>  src/modules/cdi/pcnet/pcnet.c             |   61 +++++++++++++++++-----------
>  src/modules/cdi/rtl8139/include/rtl8139.h |    4 +-
>  src/modules/cdi/rtl8139/rtl8139.c         |   13 +++++-
>  src/modules/cdi/sis900/device.c           |   15 +++++--
>  src/modules/cdi/sis900/device.h           |    2 +-
>  12 files changed, 102 insertions(+), 53 deletions(-)
> 
> diff --git a/src/modules/cdi/ata/device.c b/src/modules/cdi/ata/device.c
> index dd087c3..6e33d52 100644
> --- a/src/modules/cdi/ata/device.c
> +++ b/src/modules/cdi/ata/device.c
> @@ -34,6 +34,7 @@
>  #include "cdi/misc.h"
>  #include "cdi/io.h"
>  #include "cdi/scsi.h"
> +#include "cdi/mem.h"
>  
>  #include "device.h"
>  
> @@ -265,10 +266,17 @@ void ata_init_controller(struct ata_controller* controller)
>  
>      // Abschliessend wird noch DMA vorbereitet, wenn moeglich
>      if (controller->port_bmr_base) {
> -        cdi_alloc_phys_mem(sizeof(uint64_t), (void**) &controller->prdt_virt,
> -            (void**) &controller->prdt_phys);
> -        cdi_alloc_phys_mem(ATA_DMA_MAXSIZE, (void**) &controller->dma_buf_virt,
> -            (void**) &controller->dma_buf_phys);
> +        struct cdi_mem_area* buf;
> +
> +        buf = cdi_mem_alloc(sizeof(uint64_t),
> +            CDI_MEM_PHYS_CONTIGUOUS | CDI_MEM_DMA_4G);
> +        controller->prdt_virt = buf->vaddr;
> +        controller->prdt_phys = buf->paddr.items[0].start;
> +
> +        buf = cdi_mem_alloc(ATA_DMA_MAXSIZE,
> +            CDI_MEM_PHYS_CONTIGUOUS | CDI_MEM_DMA_4G);
> +        controller->dma_buf_virt = buf->vaddr;
> +        controller->dma_buf_phys = buf->paddr.items[0].start;
>  
>          controller->dma_use = 1;
>      }
> diff --git a/src/modules/cdi/ata/device.h b/src/modules/cdi/ata/device.h
> index efb3f6f..6c438e0 100644
> --- a/src/modules/cdi/ata/device.h
> +++ b/src/modules/cdi/ata/device.h
> @@ -367,11 +367,11 @@ struct ata_controller {
>  
>  
>      /// Physische Adresse der Physical Region Descriptor Table (fuer DMA)
> -    uint64_t*                   prdt_phys;
> +    uintptr_t                   prdt_phys;
>      /// Virtuelle Adresse der Physical Region Descriptor Table (fuer DMA)
>      uint64_t*                   prdt_virt;
>      /// Physische Adresse des DMA-Puffers
> -    void*                       dma_buf_phys;
> +    uintptr_t                   dma_buf_phys;
>      /// Virtuelle Adresse des DMA-Puffers
>      void*                       dma_buf_virt;
>  };
> diff --git a/src/modules/cdi/ata/request.c b/src/modules/cdi/ata/request.c
> index e98ee60..9d618c7 100644
> --- a/src/modules/cdi/ata/request.c
> +++ b/src/modules/cdi/ata/request.c
> @@ -433,7 +433,7 @@ static int ata_request_dma_init(struct ata_request* request)
>          BMR_STATUS_IRQ);
>  
>      // Adresse der PRDT eintragen
> -    cdi_outl(ctrl->port_bmr_base + BMR_PRDT, (uint32_t) ctrl->prdt_phys);
> +    cdi_outl(ctrl->port_bmr_base + BMR_PRDT, ctrl->prdt_phys);
>  
>      if (request->flags.direction != READ) {
>          memcpy(ctrl->dma_buf_virt, request->buffer, size);
> diff --git a/src/modules/cdi/e1000/device.c b/src/modules/cdi/e1000/device.c
> index b21df2f..1b31987 100644
> --- a/src/modules/cdi/e1000/device.c
> +++ b/src/modules/cdi/e1000/device.c
> @@ -35,6 +35,7 @@
>  #include "cdi.h"
>  #include "cdi/misc.h"
>  #include "cdi/pci.h"
> +#include "cdi/mem.h"
>  
>  #include "device.h"
>  #include "e1000_io.h"
> @@ -42,7 +43,7 @@
>  #undef DEBUG
>  
>  #define PHYS(netcard, field) \
> -    ((uintptr_t) netcard->phys + offsetof(struct e1000_device, field))
> +    (netcard->phys + offsetof(struct e1000_device, field))
>  
>  static void e1000_handle_interrupt(struct cdi_device* device);
>  static uint64_t get_mac_address(struct e1000_device* device);
> @@ -150,16 +151,22 @@ struct cdi_device* e1000_init_device(struct cdi_bus_data* bus_data)
>  {
>      struct cdi_pci_device* pci = (struct cdi_pci_device*) bus_data;
>      struct e1000_device* netcard;
> -    void* phys_device;
> +    struct cdi_mem_area* buf;
>  
>      if (!((pci->vendor_id == 0x8086) && (pci->device_id == 0x100e))) {
>          return NULL;
>      }
>  
> -    cdi_alloc_phys_mem(sizeof(*netcard), (void**) &netcard, &phys_device);
> +    buf = cdi_mem_alloc(sizeof(*netcard),
> +        CDI_MEM_PHYS_CONTIGUOUS | CDI_MEM_DMA_4G | 2);
> +    if (buf == NULL) {
> +        return NULL;
> +    }
> +
> +    netcard = buf->vaddr;
>      memset(netcard, 0, sizeof(*netcard));
>  
> -    netcard->phys = phys_device;
> +    netcard->phys = buf->paddr.items[0].start;
>      netcard->net.dev.bus_data = (struct cdi_bus_data*) pci;
>  
>      // PCI-bezogenes Zeug initialisieren
> @@ -172,8 +179,8 @@ struct cdi_device* e1000_init_device(struct cdi_bus_data* bus_data)
>      int i;
>      for (i = 0; (res = cdi_list_get(reslist, i)); i++) {
>          if (res->type == CDI_PCI_MEMORY) {
> -            netcard->mem_base =
> -                cdi_alloc_phys_addr(res->length, res->start);
> +            struct cdi_mem_area* mmio = cdi_mem_map(res->start, res->length);
> +            netcard->mem_base = mmio->vaddr;
>          }
>      }
>  
> diff --git a/src/modules/cdi/e1000/device.h b/src/modules/cdi/e1000/device.h
> index 9266e0f..2a10365 100644
> --- a/src/modules/cdi/e1000/device.h
> +++ b/src/modules/cdi/e1000/device.h
> @@ -143,7 +143,7 @@ struct e1000_rx_descriptor {
>  struct e1000_device {
>      struct cdi_net_device       net;
>  
> -    void*                       phys;
> +    uintptr_t                   phys;
>  
>      struct e1000_tx_descriptor  tx_desc[TX_BUFFER_NUM];
>      uint8_t                     tx_buffer[TX_BUFFER_NUM * TX_BUFFER_SIZE];
> diff --git a/src/modules/cdi/ne2k/include/ne2k.h b/src/modules/cdi/ne2k/include/ne2k.h
> index 585eab5..0102ce8 100644
> --- a/src/modules/cdi/ne2k/include/ne2k.h
> +++ b/src/modules/cdi/ne2k/include/ne2k.h
> @@ -71,7 +71,7 @@
>  #define NE_DATA     0x10
>  
>  #define PHYS(netcard, field) \
> -    ((uintptr_t) netcard->phys + offsetof(struct rtl8139_device, field))
> +    (netcard->phys + offsetof(struct rtl8139_device, field))
>  
>  #define RX_BUFFER_SIZE 0x2000
>  #define TX_BUFFER_SIZE 0x1000
> @@ -84,7 +84,7 @@ typedef struct {
>  struct ne2k_device {
>      struct cdi_net_device       net;
>  
> -    void*                       phys;
> +    uintptr_t                   phys;
>      uint16_t                    port_base;
>  
>      uint8_t                     next_packet;
> diff --git a/src/modules/cdi/ne2k/ne2k.c b/src/modules/cdi/ne2k/ne2k.c
> index 7f1262e..d3fa019 100644
> --- a/src/modules/cdi/ne2k/ne2k.c
> +++ b/src/modules/cdi/ne2k/ne2k.c
> @@ -35,6 +35,7 @@
>  #include "cdi/pci.h"
>  #include "cdi/io.h"
>  #include "cdi/misc.h"
> +#include "cdi/mem.h"
>  
>  #include "ne2k.h"
>  #include "ethernet.h"
> @@ -81,16 +82,22 @@ struct cdi_device* ne2k_init_device(struct cdi_bus_data* bus_data)
>  {
>      struct cdi_pci_device* pci = (struct cdi_pci_device*) bus_data;
>      struct ne2k_device* netcard;
> -    void* phys_device;
> +    struct cdi_mem_area* buf;
>  
>      if (!((pci->vendor_id == 0x10ec) && (pci->device_id == 0x8029))) {
>          return NULL;
>      }
>  
> -    cdi_alloc_phys_mem(sizeof(*netcard), (void**) &netcard, &phys_device);
> +    buf = cdi_mem_alloc(sizeof(*netcard),
> +        CDI_MEM_PHYS_CONTIGUOUS | CDI_MEM_DMA_4G | 2);
> +    if (buf == NULL) {
> +        return NULL;
> +    }
> +
> +    netcard = buf->vaddr;
>      memset(netcard, 0, sizeof(*netcard));
>  
> -    netcard->phys = phys_device;
> +    netcard->phys = buf->paddr.items[0].start;
>      netcard->net.dev.bus_data = (struct cdi_bus_data*) pci;
>  
>      // PCI-bezogenes Zeug initialisieren
> diff --git a/src/modules/cdi/pcnet/pcnet.c b/src/modules/cdi/pcnet/pcnet.c
> index e4500dc..ea0b4d7 100644
> --- a/src/modules/cdi/pcnet/pcnet.c
> +++ b/src/modules/cdi/pcnet/pcnet.c
> @@ -28,6 +28,7 @@
>  
>  #include "pcnet.h"
>  #include "cdi/io.h"
> +#include "cdi/mem.h"
>  
>  #include <stdio.h>
>  #include <string.h>
> @@ -242,14 +243,14 @@ static void pcnet_send_init_block(struct pcnet_device* netcard, int promisc)
>          (struct cdi_pci_device*) netcard->net.dev.bus_data;
>  
>      struct initialization_block* initialization_block;
> -    void* phys_initialization_block;
> -
> +    struct cdi_mem_area* buf;
>  
>      // Fill the initialization block
>      // NOTE: Transmit and receive buffer contain 8 entries
> -    cdi_alloc_phys_mem(sizeof(struct initialization_block),
> -                       (void**) &initialization_block,
> -                       &phys_initialization_block);
> +    buf = cdi_mem_alloc(sizeof(struct initialization_block),
> +        CDI_MEM_DMA_4G | CDI_MEM_PHYS_CONTIGUOUS);
> +
> +    initialization_block = buf->vaddr;
>      memset(initialization_block, 0, sizeof(struct initialization_block));
>      initialization_block->mode = promisc ? PROMISCUOUS_MODE : 0;
>      initialization_block->receive_length = 0x30;
> @@ -263,12 +264,12 @@ static void pcnet_send_init_block(struct pcnet_device* netcard, int promisc)
>      #ifdef DEBUG
>          printf("pcnet: initialization block at 0x%p virtual, 0x%p physical\n",
>                 initialization_block,
> -               phys_initialization_block);
> +               (void*) buf->paddr.items[0].start);
>      #endif
>  
>      // Set the address for the initialization block
> -    pcnet_write_csr(netcard, 1, (uintptr_t) phys_initialization_block);
> -    pcnet_write_csr(netcard, 2, (uintptr_t) phys_initialization_block >> 16);
> +    pcnet_write_csr(netcard, 1, buf->paddr.items[0].start);
> +    pcnet_write_csr(netcard, 2, buf->paddr.items[0].start >> 16);
>  
>      // TODO BCR18.BREADE / BWRITE
>  
> @@ -282,41 +283,50 @@ static void pcnet_send_init_block(struct pcnet_device* netcard, int promisc)
>      if(irq < 0 || netcard->init_wait_for_irq == 1)
>          printf("pcnet: waiting for IRQ failed: %d\n", irq);
>  
> -    // FIXME Free initialization block
> +    // Free initialization block
> +    cdi_mem_free(buf);
>  }
>  
>  void pcnet_dev_init(struct pcnet_device *netcard, int promiscuous)
>  {
>      // Allocate the receive & transmit descriptor buffer
> -    void *virt_desc_region;
> -    void *phys_desc_region;
> -    if (cdi_alloc_phys_mem(4096, &virt_desc_region, &phys_desc_region) == -1)
> -    {
> +    struct cdi_mem_area* desc;
> +
> +    desc = cdi_mem_alloc(4096, CDI_MEM_DMA_4G | CDI_MEM_PHYS_CONTIGUOUS);
> +    if (desc == NULL) {
>          printf("pcnet: failed to allocate descriptor region\n");
>          return;
>      }
>  
>      #ifdef DEBUG
> -        printf("pcnet: descriptor region at 0x%p virtual and 0x%p physical\n", virt_desc_region, phys_desc_region);
> +        printf("pcnet: descriptor region at 0x%p virtual and 0x%p physical\n",
> +            desc->vaddr, (void*) desc->paddr.items[0].start);
>      #endif
> -    netcard->receive_descriptor = virt_desc_region;
> -    netcard->transmit_descriptor = (struct transmit_descriptor*) (((char*)virt_desc_region) + 2 * 1024);
> -    netcard->phys_receive_descriptor = phys_desc_region;
> -    netcard->phys_transmit_descriptor = (void*) (((char*)phys_desc_region) + 2 * 1024);
> +    netcard->receive_descriptor = desc->vaddr;
> +    netcard->transmit_descriptor = (struct transmit_descriptor*)
> +        ((char*) desc->vaddr + 2 * 1024);
> +    netcard->phys_receive_descriptor = (void*) desc->paddr.items[0].start;
> +    netcard->phys_transmit_descriptor = (void*)
> +        ((desc->paddr.items[0].start) + 2 * 1024);
>  
>      
>      // Allocate the buffers
>      memset(netcard->transmit_descriptor, 0, 2048);
> -    void *virt_buffer;
> -    void *phys_buffer;
>      int i = 0;
>      for (;i < 4;i++)
>      {
> -        if (cdi_alloc_phys_mem(4096, &virt_buffer, &phys_buffer) == -1)
> -        {
> +        void* virt_buffer;
> +        uintptr_t phys_buffer;
> +        struct cdi_mem_area* buf;
> +
> +        buf = cdi_mem_alloc(4096, CDI_MEM_DMA_4G | CDI_MEM_PHYS_CONTIGUOUS);
> +        if (buf == 0) {
>              DEBUG_MSG("cdi_alloc_phys_mem failed");
>              return;
>          }
> +        virt_buffer = buf->vaddr;
> +        phys_buffer = buf->paddr.items[0].start;
> +
>          netcard->receive_buffer[2 * i] = virt_buffer;
>          netcard->receive_buffer[2 * i + 1] = ((char*)virt_buffer) + 2048;
>          netcard->receive_descriptor[2 * i].address = (uint32_t) phys_buffer;
> @@ -328,11 +338,14 @@ void pcnet_dev_init(struct pcnet_device *netcard, int promiscuous)
>          netcard->receive_descriptor[2 * i + 1].flags2 = 0;
>          netcard->receive_descriptor[2 * i + 1].res = 0;
>  
> -        if (cdi_alloc_phys_mem(4096, &virt_buffer, &phys_buffer) == -1)
> -        {
> +        buf = cdi_mem_alloc(4096, CDI_MEM_DMA_4G | CDI_MEM_PHYS_CONTIGUOUS);
> +        if (buf == 0) {
>              DEBUG_MSG("cdi_alloc_phys_mem failed");
>              return;
>          }
> +        virt_buffer = buf->vaddr;
> +        phys_buffer = buf->paddr.items[0].start;
> +
>          netcard->transmit_buffer[2 * i] = virt_buffer;
>          netcard->transmit_buffer[2 * i + 1] = ((char*)virt_buffer) + 2048;
>          netcard->transmit_descriptor[2 * i].address = (uint32_t) phys_buffer;
> diff --git a/src/modules/cdi/rtl8139/include/rtl8139.h b/src/modules/cdi/rtl8139/include/rtl8139.h
> index 3ec81b0..aafa71f 100644
> --- a/src/modules/cdi/rtl8139/include/rtl8139.h
> +++ b/src/modules/cdi/rtl8139/include/rtl8139.h
> @@ -70,7 +70,7 @@
>  #define ISR_RECEIVE_OK                  (1 << 0)
>  
>  #define PHYS(netcard, field) \
> -    ((uintptr_t) netcard->phys + offsetof(struct rtl8139_device, field))
> +    (netcard->phys + offsetof(struct rtl8139_device, field))
>  
>  #define RX_BUFFER_SIZE 0x2000
>  #define TX_BUFFER_SIZE 0x1000
> @@ -83,7 +83,7 @@ typedef struct {
>  struct rtl8139_device {
>      struct cdi_net_device       net;
>  
> -    void*                       phys;
> +    uintptr_t                   phys;
>      uint16_t                    port_base;
>  
>      uint8_t                     buffer[TX_BUFFER_SIZE]
> diff --git a/src/modules/cdi/rtl8139/rtl8139.c b/src/modules/cdi/rtl8139/rtl8139.c
> index 600f3e9..6571c56 100644
> --- a/src/modules/cdi/rtl8139/rtl8139.c
> +++ b/src/modules/cdi/rtl8139/rtl8139.c
> @@ -35,6 +35,7 @@
>  #include "cdi/pci.h"
>  #include "cdi/io.h"
>  #include "cdi/misc.h"
> +#include "cdi/mem.h"
>  
>  #include "rtl8139.h"
>  #include "ethernet.h"
> @@ -79,16 +80,22 @@ struct cdi_device* rtl8139_init_device(struct cdi_bus_data* bus_data)
>  {
>      struct cdi_pci_device* pci = (struct cdi_pci_device*) bus_data;
>      struct rtl8139_device* netcard;
> -    void* phys_device;
> +    struct cdi_mem_area* buf;
>  
>      if (!((pci->vendor_id == 0x10ec) && (pci->device_id == 0x8139))) {
>          return NULL;
>      }
>  
> -    cdi_alloc_phys_mem(sizeof(*netcard), (void**) &netcard, &phys_device);
> +    buf = cdi_mem_alloc(sizeof(*netcard),
> +        CDI_MEM_PHYS_CONTIGUOUS | CDI_MEM_DMA_4G | 2);
> +    if (buf == NULL) {
> +        return NULL;
> +    }
> +
> +    netcard = buf->vaddr;
>      memset(netcard, 0, sizeof(*netcard));
>  
> -    netcard->phys = phys_device;
> +    netcard->phys = buf->paddr.items[0].start;
>      netcard->net.dev.bus_data = (struct cdi_bus_data*) pci;
>  
>      // PCI-bezogenes Zeug initialisieren
> diff --git a/src/modules/cdi/sis900/device.c b/src/modules/cdi/sis900/device.c
> index 30c6d39..aa5d7c8 100644
> --- a/src/modules/cdi/sis900/device.c
> +++ b/src/modules/cdi/sis900/device.c
> @@ -34,6 +34,7 @@
>  
>  #include "cdi.h"
>  #include "cdi/misc.h"
> +#include "cdi/mem.h"
>  
>  #include "device.h"
>  #include "sis900_io.h"
> @@ -46,7 +47,7 @@
>  #undef DEBUG
>  
>  #define PHYS(netcard, field) \
> -    ((uintptr_t) netcard->phys + offsetof(struct sis900_device, field))
> +    (netcard->phys + offsetof(struct sis900_device, field))
>  
>  static void sis900_handle_interrupt(struct cdi_device* device);
>  
> @@ -185,16 +186,22 @@ struct cdi_device* sis900_init_device(struct cdi_bus_data* bus_data)
>  {
>      struct cdi_pci_device* pci = (struct cdi_pci_device*) bus_data;
>      struct sis900_device* netcard;
> -    void* phys_device;
> +    struct cdi_mem_area* buf;
>  
>      if (!((pci->vendor_id == 0x1039) && (pci->device_id == 0x0900))) {
>          return NULL;
>      }
>  
> -    cdi_alloc_phys_mem(sizeof(*netcard), (void**) &netcard, &phys_device);
> +    buf = cdi_mem_alloc(sizeof(*netcard),
> +        CDI_MEM_PHYS_CONTIGUOUS | CDI_MEM_DMA_4G | 2);
> +    if (buf == NULL) {
> +        return NULL;
> +    }
> +
> +    netcard = buf->vaddr;
>      memset(netcard, 0, sizeof(*netcard));
>  
> -    netcard->phys = phys_device;
> +    netcard->phys = buf->paddr.items[0].start;
>      netcard->net.dev.bus_data = (struct cdi_bus_data*) pci;
>  
>      // PCI-bezogenes Zeug initialisieren
> diff --git a/src/modules/cdi/sis900/device.h b/src/modules/cdi/sis900/device.h
> index cd110c0..7698d2f 100644
> --- a/src/modules/cdi/sis900/device.h
> +++ b/src/modules/cdi/sis900/device.h
> @@ -129,7 +129,7 @@ struct sis900_tx_descriptor {
>  struct sis900_device {
>      struct cdi_net_device       net;
>  
> -    void*                       phys;
> +    uintptr_t                   phys;
>  
>      struct sis900_tx_descriptor tx_desc[TX_BUFFER_NUM];
>      uint8_t                     tx_buffer[TX_BUFFER_NUM * TX_BUFFER_SIZE];

Sieht vernünftig aus.

Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgp_aNoKkkgG8.pgp
Description: PGP signature