mirror of
https://github.com/patjak/facetimehd.git
synced 2026-04-09 11:02:31 +02:00
Preallocate firmware memory at mem init
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
This commit is contained in:
42
isp.c
42
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);
|
||||
|
||||
|
||||
4
isp.h
4
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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user