From ab3181bffa49db717b0aafa3a9be97ef15d34d4e Mon Sep 17 00:00:00 2001 From: Patrik Jakobsson Date: Sat, 5 Sep 2015 14:40:13 +0200 Subject: [PATCH] Preallocate firmware memory at mem init Signed-off-by: Patrik Jakobsson --- isp.c | 42 +++++++++++++++++++++++++++--------------- isp.h | 4 ++++ 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/isp.c b/isp.c index 0cb23df..1e4a39d 100644 --- a/isp.c +++ b/isp.c @@ -27,9 +27,26 @@ int isp_mem_init(struct bcwc_private *dev_priv) { - dev_priv->mem = &dev_priv->pdev->resource[BCWC_PCI_S2_MEM]; - if (!dev_priv->mem) + struct resource *root = &dev_priv->pdev->resource[BCWC_PCI_S2_MEM]; + int ret; + + ret = allocate_resource(root, dev_priv->mem, FTHD_MEM_SIZE, root->start, + root->end, PAGE_SIZE, NULL, NULL); + if (ret) { + dev_err(&dev_priv->pdev->dev, + "Failed to initialize ISP memory manager\n"); return -EIO; + } + + /* Preallocate 8mb for the firmware */ + dev_priv->firmware = isp_mem_create(dev_priv, FTHD_MEM_FIRMWARE, + FTHD_MEM_FW_SIZE); + + if (!dev_priv->firmware) { + dev_err(&dev_priv->pdev->dev, + "Failed to preallocate firmware memory\n"); + return -ENOMEM; + } return 0; } @@ -128,27 +145,20 @@ static int isp_enable_sensor(struct bcwc_private *dev_priv) static int isp_load_firmware(struct bcwc_private *dev_priv) { const struct firmware *fw; - struct resource *res; int ret = 0; ret = request_firmware(&fw, "fthd.bin", &dev_priv->pdev->dev); if (ret) return ret; - /* - * The firmware must be the first thing we allocate since it needs to - * be at offset 0. Would be better if we preallocated memory for it and - * then resized it to not waste any space. - */ - dev_priv->firmware = isp_mem_create(dev_priv, FTHD_MEM_FIRMWARE, - fw->size); + /* Firmware memory is preallocated at init time */ if (!dev_priv->firmware) return -ENOMEM; - if (res->start != dev_priv->mem->start) { + if (dev_priv->firmware->base.start != dev_priv->mem->start) { dev_err(&dev_priv->pdev->dev, - "Misaligned firmware memory object (offset: %Ld)\n", - res->start - dev_priv->mem->start); + "Misaligned firmware memory object (offset: %lu)\n", + dev_priv->firmware->offset); isp_mem_destroy(dev_priv->firmware); return -EBUSY; } @@ -156,8 +166,10 @@ static int isp_load_firmware(struct bcwc_private *dev_priv) memcpy(dev_priv->s2_mem + dev_priv->firmware->offset, fw->data, fw->size); - dev_info(&dev_priv->pdev->dev, "Loaded firmware, size: %lukb (%Lukb)\n", - fw->size / 1024, (res->end - res->start) / 1024); + /* Might need a flush here if we map ISP memory cached */ + + dev_info(&dev_priv->pdev->dev, "Loaded firmware, size: %lukb\n", + fw->size / 1024); release_firmware(fw); diff --git a/isp.h b/isp.h index 2763016..3432735 100644 --- a/isp.h +++ b/isp.h @@ -25,10 +25,14 @@ #define FTHD_MEM_HEAP 2 #define FTHD_MEM_IPC_QUEUE 3 +#define FTHD_MEM_SIZE 0x8000000 /* 128mb */ +#define FTHD_MEM_FW_SIZE 0x800000 /* 8mb */ + struct isp_mem_obj { struct resource base; unsigned int type; resource_size_t size; + resource_size_t size_aligned; unsigned long offset; };