blob: 17c178fcf9c069a8eb0fa0303a54e39fce03befd [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2013 - 2020 Intel Corporation */
#ifndef IPU_H
#define IPU_H
#include <linux/ioport.h>
#include <linux/list.h>
#include <uapi/linux/media.h>
#include <linux/version.h>
#include "ipu-pdata.h"
#include "ipu-bus.h"
#include "ipu-buttress.h"
#include "ipu-trace.h"
#define IPU6_PCI_ID 0x9a19
#define IPU6SE_PCI_ID 0x4e19
#define IPU6EP_ADL_P_PCI_ID 0x465d
#define IPU6EP_ADL_N_PCI_ID 0x462e
#define IPU6EP_RPL_P_PCI_ID 0xa75d
#define IPU6EP_MTL_PCI_ID 0x7d19
enum ipu_version {
IPU_VER_INVALID = 0,
IPU_VER_6,
IPU_VER_6SE,
IPU_VER_6EP,
IPU_VER_6EP_MTL,
};
/*
* IPU version definitions to reflect the IPU driver changes.
* Both ISYS and PSYS share the same version.
*/
#define IPU_MAJOR_VERSION 1
#define IPU_MINOR_VERSION 0
#define IPU_DRIVER_VERSION (IPU_MAJOR_VERSION << 16 | IPU_MINOR_VERSION)
/* processing system frequency: 25Mhz x ratio, Legal values [8,32] */
#define PS_FREQ_CTL_DEFAULT_RATIO 0x12
/* input system frequency: 1600Mhz / divisor. Legal values [2,8] */
#define IS_FREQ_SOURCE 1600000000
#define IS_FREQ_CTL_DIVISOR 0x4
/*
* ISYS DMA can overshoot. For higher resolutions over allocation is one line
* but it must be at minimum 1024 bytes. Value could be different in
* different versions / generations thus provide it via platform data.
*/
#define IPU_ISYS_OVERALLOC_MIN 1024
/*
* Physical pages in GDA is 128, page size is 2K for IPU6, 1K for others.
*/
#define IPU_DEVICE_GDA_NR_PAGES 128
/*
* Virtualization factor to calculate the available virtual pages.
*/
#define IPU_DEVICE_GDA_VIRT_FACTOR 32
struct pci_dev;
struct list_head;
struct firmware;
#define NR_OF_MMU_RESOURCES 2
struct ipu_device {
struct pci_dev *pdev;
struct list_head devices;
struct ipu_bus_device *isys;
struct ipu_bus_device *psys;
struct ipu_buttress buttress;
const struct firmware *cpd_fw;
const char *cpd_fw_name;
u64 *pkg_dir;
dma_addr_t pkg_dir_dma_addr;
unsigned int pkg_dir_size;
struct sg_table fw_sgt;
void __iomem *base;
#ifdef CONFIG_DEBUG_FS
struct dentry *ipu_dir;
#endif
struct ipu_trace *trace;
bool flr_done;
bool ipc_reinit;
bool secure_mode;
int (*cpd_fw_reload)(struct ipu_device *isp);
};
#define IPU_DMA_MASK 39
#define IPU_LIB_CALL_TIMEOUT_MS 2000
#define IPU_PSYS_CMD_TIMEOUT_MS 2000
#define IPU_PSYS_OPEN_TIMEOUT_US 50
#define IPU_PSYS_OPEN_RETRY (10000 / IPU_PSYS_OPEN_TIMEOUT_US)
int ipu_fw_authenticate(void *data, u64 val);
void ipu_configure_spc(struct ipu_device *isp,
const struct ipu_hw_variants *hw_variant,
int pkg_dir_idx, void __iomem *base, u64 *pkg_dir,
dma_addr_t pkg_dir_dma_addr);
int request_cpd_fw(const struct firmware **firmware_p, const char *name,
struct device *device);
extern enum ipu_version ipu_ver;
void ipu_internal_pdata_init(void);
#endif /* IPU_H */