/*
* drivers/video/tegra/host/host1x/host1x.h
*
* Tegra Graphics Host Driver Entrypoint
*
* Copyright (c) 2010-2019, NVIDIA Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef __NVHOST_HOST1X_H
#define __NVHOST_HOST1X_H
#include
#include
#include
#include "nvhost_syncpt.h"
#include "nvhost_channel.h"
#include "nvhost_intr.h"
#define TRACE_MAX_LENGTH 128U
#define IFACE_NAME "nvhost"
struct nvhost_chip_support;
struct nvhost_channel;
struct mem_mgr;
extern long linsim_cl;
/*
* Policy determines how do we store the syncpts,
* i.e. either per channel (in struct nvhost_channel)
* or per channel instance (in struct nvhost_channel_userctx)
*/
enum nvhost_syncpt_policy {
SYNCPT_PER_CHANNEL = 0,
SYNCPT_PER_CHANNEL_INSTANCE,
};
/*
* Policy determines when to map HW channel to device,
* i.e. either on channel device node open time
* or on work submission time
*/
enum nvhost_channel_policy {
MAP_CHANNEL_ON_OPEN = 0,
MAP_CHANNEL_ON_SUBMIT,
};
struct host1x_device_info {
/* Channel info */
int nb_channels; /* host1x: num channels supported */
int ch_base; /* host1x: channel base */
int ch_limit; /* host1x: channel limit */
enum nvhost_channel_policy channel_policy; /* host1x: channel policy */
/* Syncpoint info */
int nb_hw_pts; /* host1x: num syncpoints supported
in h/w */
int nb_pts; /* host1x: num syncpoints supported
in s/w where nb_pts <= nb_hw_pts */
int pts_base; /* host1x: syncpoint base */
int pts_limit; /* host1x: syncpoint limit */
enum nvhost_syncpt_policy syncpt_policy; /* host1x: syncpoint policy */
int nb_mlocks; /* host1x: number of mlocks */
int (*initialize_chip_support)(struct nvhost_master *,
struct nvhost_chip_support *);
int nb_actmons;
size_t firmware_area_size;
/* true if host1x access direct but engines are not owned */
bool vmserver_owns_engines;
/* true if hw supports remote syncpoint interrupts */
bool use_cross_vm_interrupts;
/* host1x: reg resources */
char *resources[NVHOST_MODULE_MAX_IORESOURCE_MEM];
/* host1x: number of resources */
int nb_resources;
/* cmdfifo only accessible from hypervisor? */
bool secure_cmdfifo;
/* dma mask for host1x and clients */
u64 dma_mask;
};
struct nvhost_vm_firmware_area {
void *vaddr;
dma_addr_t dma_addr;
unsigned long *bitmap;
unsigned long bitmap_size_bits;
unsigned long bitmap_size_bytes;
struct mutex mutex;
};
struct nvhost_master {
void __iomem *aperture;
void __iomem *sync_aperture;
struct class *nvhost_class;
struct cdev cdev;
struct device *ctrl;
struct nvhost_syncpt syncpt;
struct nvhost_intr intr;
struct platform_device *dev;
atomic_t clientid;
struct host1x_device_info info;
struct nvhost_characteristics nvhost_char;
struct kobject *caps_kobj;
struct nvhost_capability_node *caps_nodes;
int major;
int next_minor;
struct mutex chrdev_mutex;
struct mutex timeout_mutex;
struct nvhost_channel **chlist; /* channel list */
struct mutex chlist_mutex; /* mutex for channel list */
struct mutex ch_alloc_mutex; /* mutex for channel allocation */
struct semaphore free_channels; /* Semaphore tracking free channels */
unsigned long allocated_channels[2];
/* nvhost vm specific structures */
struct nvhost_vm_firmware_area firmware_area;
struct list_head static_mappings_list;
struct list_head vm_list;
struct mutex vm_mutex;
struct mutex vm_alloc_mutex;
/* for nvhost_masters list */
struct list_head list;
struct rb_root syncpt_backing_head;
};
#ifdef CONFIG_DEBUG_FS
void nvhost_debug_init(struct nvhost_master *master);
void nvhost_device_debug_init(struct platform_device *dev);
void nvhost_device_debug_deinit(struct platform_device *dev);
void nvhost_debug_dump(struct nvhost_master *master);
#else
static inline void nvhost_debug_init(struct nvhost_master *master)
{
}
static inline void nvhost_device_debug_init(struct platform_device *dev)
{
}
static inline void nvhost_device_debug_deinit(struct platform_device *dev)
{
}
static inline void nvhost_debug_dump(struct nvhost_master *master)
{
}
#endif
int nvhost_host1x_finalize_poweron(struct platform_device *dev);
int nvhost_host1x_prepare_poweroff(struct platform_device *dev);
void nvhost_set_chanops(struct nvhost_channel *ch);
int nvhost_gather_filter_enabled(struct nvhost_syncpt *sp);
int nvhost_update_characteristics(struct platform_device *dev);
static inline void *nvhost_get_falcon_data(struct platform_device *_dev)
{
struct nvhost_device_data *pdata =
(struct nvhost_device_data *)platform_get_drvdata(_dev);
WARN_ON(!pdata);
return pdata ? pdata->falcon_data : NULL;
}
static inline void nvhost_set_falcon_data(struct platform_device *_dev,
void *priv_data)
{
struct nvhost_device_data *pdata =
(struct nvhost_device_data *)platform_get_drvdata(_dev);
WARN_ON(!pdata);
pdata->falcon_data = priv_data;
}
static inline void *nvhost_get_private_data(struct platform_device *_dev)
{
struct nvhost_device_data *pdata =
(struct nvhost_device_data *)platform_get_drvdata(_dev);
WARN_ON(!pdata);
return pdata ? pdata->private_data : NULL;
}
static inline void nvhost_set_private_data(struct platform_device *_dev,
void *priv_data)
{
struct nvhost_device_data *pdata =
(struct nvhost_device_data *)platform_get_drvdata(_dev);
WARN_ON(!pdata);
pdata->private_data = priv_data;
}
struct nvhost_master *nvhost_get_prim_host(void);
static inline struct nvhost_master *nvhost_get_host(
struct platform_device *_dev)
{
struct platform_device *pdev;
if (_dev->dev.parent && _dev->dev.parent != &platform_bus) {
pdev = to_platform_device(_dev->dev.parent);
return nvhost_get_private_data(pdev);
} else
return nvhost_get_private_data(_dev);
}
static inline struct platform_device *nvhost_get_parent(
struct platform_device *_dev)
{
return (_dev->dev.parent && _dev->dev.parent != &platform_bus)
? to_platform_device(_dev->dev.parent) : NULL;
}
struct nvhost_master *nvhost_get_syncpt_owner(u32 id);
struct nvhost_syncpt *nvhost_get_syncpt_owner_struct(u32 id,
struct nvhost_syncpt *default_syncpt);
#endif