Preallocate firmware memory at mem init

Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
This commit is contained in:
Patrik Jakobsson
2015-09-05 14:40:13 +02:00
parent 084ad77195
commit ab3181bffa
2 changed files with 31 additions and 15 deletions

42
isp.c
View File

@@ -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);

4
isp.h
View File

@@ -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;
};