diff --git a/bcwc_drv.c b/bcwc_drv.c index 4236bb5..bf47777 100644 --- a/bcwc_drv.c +++ b/bcwc_drv.c @@ -31,6 +31,12 @@ static int bcwc_pci_reserve_mem(struct bcwc_private *dev_priv) return ret; } + ret = pci_request_region(dev_priv->pdev, BCWC_PCI_S2_MEM, "S2 MEM"); + if (ret) { + dev_err(&dev_priv->pdev->dev, "Failed to request S2 MEM\n"); + return ret; + } + ret = pci_request_region(dev_priv->pdev, BCWC_PCI_ISP_IO, "ISP IO"); if (ret) { dev_err(&dev_priv->pdev->dev, "Failed to request ISP IO\n"); @@ -43,6 +49,12 @@ static int bcwc_pci_reserve_mem(struct bcwc_private *dev_priv) dev_priv->s2_io = ioremap_nocache(start, len); dev_priv->s2_io_len = len; + /* S2 MEM */ + start = pci_resource_start(dev_priv->pdev, BCWC_PCI_S2_MEM); + len = pci_resource_len(dev_priv->pdev, BCWC_PCI_S2_MEM); + dev_priv->s2_mem = ioremap_nocache(start, len); + dev_priv->s2_mem_len = len; + /* ISP IO */ start = pci_resource_start(dev_priv->pdev, BCWC_PCI_ISP_IO); len = pci_resource_len(dev_priv->pdev, BCWC_PCI_ISP_IO); @@ -53,6 +65,10 @@ static int bcwc_pci_reserve_mem(struct bcwc_private *dev_priv) "Allocated S2 regs (BAR %d). %u bytes at 0x%p", BCWC_PCI_S2_IO, dev_priv->s2_io_len, dev_priv->s2_io); + dev_info(&dev_priv->pdev->dev, + "Allocated S2 mem (BAR %d). %u bytes at 0x%p", + BCWC_PCI_S2_MEM, dev_priv->s2_mem_len, dev_priv->s2_mem); + dev_info(&dev_priv->pdev->dev, "Allocated ISP regs (BAR %d). %u bytes at 0x%p", BCWC_PCI_ISP_IO, dev_priv->isp_io_len, dev_priv->isp_io); diff --git a/bcwc_drv.h b/bcwc_drv.h index 732876a..6583623 100644 --- a/bcwc_drv.h +++ b/bcwc_drv.h @@ -31,6 +31,10 @@ struct bcwc_private { /* Mapped PCI resources */ void *s2_io; u32 s2_io_len; + + void *s2_mem; + u32 s2_mem_len; + void *isp_io; u32 isp_io_len; diff --git a/bcwc_hw.h b/bcwc_hw.h index 2152bf3..ed82eee 100644 --- a/bcwc_hw.h +++ b/bcwc_hw.h @@ -17,6 +17,9 @@ #define BCWC_S2_REG_READ(offset) _BCWC_S2_REG_READ(dev_priv, (offset)) #define BCWC_S2_REG_WRITE(val, offset) _BCWC_S2_REG_WRITE(dev_priv, (val), (offset)) +#define BCWC_S2_MEM_READ(offset) _BCWC_S2_MEM_READ(dev_priv, (offset)) +#define BCWC_S2_MEM_WRITE(val, offset) _BCWC_S2_MEM_WRITE(dev_priv, (val), (offset)) + #define BCWC_ISP_REG_READ(offset) _BCWC_ISP_REG_READ(dev_priv, (offset)) #define BCWC_ISP_REG_WRITE(val, offset) _BCWC_ISP_REG_WRITE(dev_priv, (val), (offset)) @@ -45,6 +48,31 @@ static inline void _BCWC_S2_REG_WRITE(struct bcwc_private *dev_priv, u32 val, iowrite32(val, dev_priv->s2_io + offset); } +static inline u32 _BCWC_S2_MEM_READ(struct bcwc_private *dev_priv, u32 offset) +{ + if (offset >= dev_priv->s2_mem_len) { + dev_err(&dev_priv->pdev->dev, + "S2 MEM read out of range at %u\n", offset); + return 0; + } + + // dev_info(&dev_priv->pdev->dev, "Link IO read at %u\n", offset); + return ioread32(dev_priv->s2_mem + offset); +} + +static inline void _BCWC_S2_MEM_WRITE(struct bcwc_private *dev_priv, u32 val, + u32 offset) +{ + if (offset >= dev_priv->s2_mem_len) { + dev_err(&dev_priv->pdev->dev, + "S2 MEM write out of range at %u\n", offset); + return; + } + + // dev_info(&dev_priv->pdev->dev, "S2 IO write at %u\n", offset); + iowrite32(val, dev_priv->s2_mem + offset); +} + static inline u32 _BCWC_ISP_REG_READ(struct bcwc_private *dev_priv, u32 offset) { if (offset >= dev_priv->isp_io_len) {