Commit b0654103 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm/tegra/for-3.19-rc1' of git://people.freedesktop.org/~tagr/linux into drm-next

drm/tegra: Changes for v3.19-rc1

The highlights in this pull request are:

  * IOMMU support: The Tegra DRM driver can now deal with discontiguous
    buffers if an IOMMU exists in the system. That means it can allocate
    using drm_gem_get_pages() and will map them into IOVA space via the
    IOMMU API. Similarly, non-contiguous PRIME buffers can be imported
    from a different driver, which allows better integration with gk20a
    (nouveau) and less hacks.

  * Universal planes: This is precursory work for atomic modesetting and
    will allow hardware cursor support to be implemented on pre-Tegra114
    where RGB cursors were not supported.

  * DSI ganged-mode support: The DSI controller can now gang up with a
    second DSI controller to drive high resolution DSI panels.

Besides those bigger changes there is a slew of fixes, cleanups, plugged
memory leaks and so on.

* tag 'drm/tegra/for-3.19-rc1' of git://people.freedesktop.org/~tagr/linux: (44 commits)
  drm/tegra: gem: Check before freeing CMA memory
  drm/tegra: fb: Add error codes to error messages
  drm/tegra: fb: Properly release GEM objects on failure
  drm/tegra: Detach panel when a connector is removed
  drm/tegra: Plug memory leak
  drm/tegra: gem: Use more consistent data types
  drm/tegra: fb: Do not destroy framebuffer
  drm/tegra: gem: dumb: pitch and size are outputs
  drm/tegra: Enable the hotplug interrupt only when necessary
  drm/tegra: dc: Universal plane support
  drm/tegra: dc: Registers are 32 bits wide
  drm/tegra: dc: Factor out DC, window and cursor commit
  drm/tegra: Add IOMMU support
  drm/tegra: Fix error handling cleanup
  drm/tegra: gem: Use dma_mmap_writecombine()
  drm/tegra: gem: Remove redundant drm_gem_free_mmap_offset()
  drm/tegra: gem: Cleanup tegra_bo_create_with_handle()
  drm/tegra: gem: Extract tegra_bo_alloc_object()
  drm/tegra: dsi: Set up PHY_TIMING & BTA_TIMING registers earlier
  drm/tegra: dsi: Replace 1000000 by USEC_PER_SEC
  ...
parents 4fb2ac6e 7e0180e3
...@@ -191,6 +191,8 @@ of the following host1x client modules: ...@@ -191,6 +191,8 @@ of the following host1x client modules:
- nvidia,hpd-gpio: specifies a GPIO used for hotplug detection - nvidia,hpd-gpio: specifies a GPIO used for hotplug detection
- nvidia,edid: supplies a binary EDID blob - nvidia,edid: supplies a binary EDID blob
- nvidia,panel: phandle of a display panel - nvidia,panel: phandle of a display panel
- nvidia,ganged-mode: contains a phandle to a second DSI controller to gang
up with in order to support up to 8 data lanes
- sor: serial output resource - sor: serial output resource
......
config DRM_TEGRA config DRM_TEGRA
tristate "NVIDIA Tegra DRM" tristate "NVIDIA Tegra DRM"
depends on ARCH_TEGRA || (ARM && COMPILE_TEST) depends on ARCH_TEGRA || (ARM && COMPILE_TEST)
depends on COMMON_CLK
depends on DRM depends on DRM
depends on RESET_CONTROLLER depends on RESET_CONTROLLER
select DRM_KMS_HELPER select DRM_KMS_HELPER
......
This diff is collapsed.
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
*/ */
#include <linux/host1x.h> #include <linux/host1x.h>
#include <linux/iommu.h>
#include "drm.h" #include "drm.h"
#include "gem.h" #include "gem.h"
...@@ -33,6 +34,17 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) ...@@ -33,6 +34,17 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
if (!tegra) if (!tegra)
return -ENOMEM; return -ENOMEM;
if (iommu_present(&platform_bus_type)) {
tegra->domain = iommu_domain_alloc(&platform_bus_type);
if (IS_ERR(tegra->domain)) {
err = PTR_ERR(tegra->domain);
goto free;
}
DRM_DEBUG("IOMMU context initialized\n");
drm_mm_init(&tegra->mm, 0, SZ_2G);
}
mutex_init(&tegra->clients_lock); mutex_init(&tegra->clients_lock);
INIT_LIST_HEAD(&tegra->clients); INIT_LIST_HEAD(&tegra->clients);
drm->dev_private = tegra; drm->dev_private = tegra;
...@@ -42,13 +54,13 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) ...@@ -42,13 +54,13 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
err = tegra_drm_fb_prepare(drm); err = tegra_drm_fb_prepare(drm);
if (err < 0) if (err < 0)
return err; goto config;
drm_kms_helper_poll_init(drm); drm_kms_helper_poll_init(drm);
err = host1x_device_init(device); err = host1x_device_init(device);
if (err < 0) if (err < 0)
return err; goto fbdev;
/* /*
* We don't use the drm_irq_install() helpers provided by the DRM * We don't use the drm_irq_install() helpers provided by the DRM
...@@ -59,18 +71,37 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) ...@@ -59,18 +71,37 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
err = drm_vblank_init(drm, drm->mode_config.num_crtc); err = drm_vblank_init(drm, drm->mode_config.num_crtc);
if (err < 0) if (err < 0)
return err; goto device;
err = tegra_drm_fb_init(drm); err = tegra_drm_fb_init(drm);
if (err < 0) if (err < 0)
return err; goto vblank;
return 0; return 0;
vblank:
drm_vblank_cleanup(drm);
device:
host1x_device_exit(device);
fbdev:
drm_kms_helper_poll_fini(drm);
tegra_drm_fb_free(drm);
config:
drm_mode_config_cleanup(drm);
if (tegra->domain) {
iommu_domain_free(tegra->domain);
drm_mm_takedown(&tegra->mm);
}
free:
kfree(tegra);
return err;
} }
static int tegra_drm_unload(struct drm_device *drm) static int tegra_drm_unload(struct drm_device *drm)
{ {
struct host1x_device *device = to_host1x_device(drm->dev); struct host1x_device *device = to_host1x_device(drm->dev);
struct tegra_drm *tegra = drm->dev_private;
int err; int err;
drm_kms_helper_poll_fini(drm); drm_kms_helper_poll_fini(drm);
...@@ -82,6 +113,13 @@ static int tegra_drm_unload(struct drm_device *drm) ...@@ -82,6 +113,13 @@ static int tegra_drm_unload(struct drm_device *drm)
if (err < 0) if (err < 0)
return err; return err;
if (tegra->domain) {
iommu_domain_free(tegra->domain);
drm_mm_takedown(&tegra->mm);
}
kfree(tegra);
return 0; return 0;
} }
......
...@@ -39,6 +39,9 @@ struct tegra_fbdev { ...@@ -39,6 +39,9 @@ struct tegra_fbdev {
struct tegra_drm { struct tegra_drm {
struct drm_device *drm; struct drm_device *drm;
struct iommu_domain *domain;
struct drm_mm mm;
struct mutex clients_lock; struct mutex clients_lock;
struct list_head clients; struct list_head clients;
...@@ -101,6 +104,7 @@ struct tegra_dc { ...@@ -101,6 +104,7 @@ struct tegra_dc {
spinlock_t lock; spinlock_t lock;
struct drm_crtc base; struct drm_crtc base;
int powergate;
int pipe; int pipe;
struct clk *clk; struct clk *clk;
...@@ -120,6 +124,8 @@ struct tegra_dc { ...@@ -120,6 +124,8 @@ struct tegra_dc {
struct drm_pending_vblank_event *event; struct drm_pending_vblank_event *event;
const struct tegra_dc_soc_info *soc; const struct tegra_dc_soc_info *soc;
struct iommu_domain *domain;
}; };
static inline struct tegra_dc * static inline struct tegra_dc *
...@@ -133,16 +139,15 @@ static inline struct tegra_dc *to_tegra_dc(struct drm_crtc *crtc) ...@@ -133,16 +139,15 @@ static inline struct tegra_dc *to_tegra_dc(struct drm_crtc *crtc)
return crtc ? container_of(crtc, struct tegra_dc, base) : NULL; return crtc ? container_of(crtc, struct tegra_dc, base) : NULL;
} }
static inline void tegra_dc_writel(struct tegra_dc *dc, unsigned long value, static inline void tegra_dc_writel(struct tegra_dc *dc, u32 value,
unsigned long reg) unsigned long offset)
{ {
writel(value, dc->regs + (reg << 2)); writel(value, dc->regs + (offset << 2));
} }
static inline unsigned long tegra_dc_readl(struct tegra_dc *dc, static inline u32 tegra_dc_readl(struct tegra_dc *dc, unsigned long offset)
unsigned long reg)
{ {
return readl(dc->regs + (reg << 2)); return readl(dc->regs + (offset << 2));
} }
struct tegra_dc_window { struct tegra_dc_window {
...@@ -287,6 +292,7 @@ bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer); ...@@ -287,6 +292,7 @@ bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer, int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
struct tegra_bo_tiling *tiling); struct tegra_bo_tiling *tiling);
int tegra_drm_fb_prepare(struct drm_device *drm); int tegra_drm_fb_prepare(struct drm_device *drm);
void tegra_drm_fb_free(struct drm_device *drm);
int tegra_drm_fb_init(struct drm_device *drm); int tegra_drm_fb_init(struct drm_device *drm);
void tegra_drm_fb_exit(struct drm_device *drm); void tegra_drm_fb_exit(struct drm_device *drm);
#ifdef CONFIG_DRM_TEGRA_FBDEV #ifdef CONFIG_DRM_TEGRA_FBDEV
......
This diff is collapsed.
...@@ -21,9 +21,16 @@ ...@@ -21,9 +21,16 @@
#define DSI_INT_STATUS 0x0d #define DSI_INT_STATUS 0x0d
#define DSI_INT_MASK 0x0e #define DSI_INT_MASK 0x0e
#define DSI_HOST_CONTROL 0x0f #define DSI_HOST_CONTROL 0x0f
#define DSI_HOST_CONTROL_FIFO_RESET (1 << 21)
#define DSI_HOST_CONTROL_CRC_RESET (1 << 20)
#define DSI_HOST_CONTROL_TX_TRIG_SOL (0 << 12)
#define DSI_HOST_CONTROL_TX_TRIG_FIFO (1 << 12)
#define DSI_HOST_CONTROL_TX_TRIG_HOST (2 << 12)
#define DSI_HOST_CONTROL_RAW (1 << 6) #define DSI_HOST_CONTROL_RAW (1 << 6)
#define DSI_HOST_CONTROL_HS (1 << 5) #define DSI_HOST_CONTROL_HS (1 << 5)
#define DSI_HOST_CONTROL_BTA (1 << 2) #define DSI_HOST_CONTROL_FIFO_SEL (1 << 4)
#define DSI_HOST_CONTROL_IMM_BTA (1 << 3)
#define DSI_HOST_CONTROL_PKT_BTA (1 << 2)
#define DSI_HOST_CONTROL_CS (1 << 1) #define DSI_HOST_CONTROL_CS (1 << 1)
#define DSI_HOST_CONTROL_ECC (1 << 0) #define DSI_HOST_CONTROL_ECC (1 << 0)
#define DSI_CONTROL 0x10 #define DSI_CONTROL 0x10
...@@ -39,9 +46,13 @@ ...@@ -39,9 +46,13 @@
#define DSI_SOL_DELAY 0x11 #define DSI_SOL_DELAY 0x11
#define DSI_MAX_THRESHOLD 0x12 #define DSI_MAX_THRESHOLD 0x12
#define DSI_TRIGGER 0x13 #define DSI_TRIGGER 0x13
#define DSI_TRIGGER_HOST (1 << 1)
#define DSI_TRIGGER_VIDEO (1 << 0)
#define DSI_TX_CRC 0x14 #define DSI_TX_CRC 0x14
#define DSI_STATUS 0x15 #define DSI_STATUS 0x15
#define DSI_STATUS_IDLE (1 << 10) #define DSI_STATUS_IDLE (1 << 10)
#define DSI_STATUS_UNDERFLOW (1 << 9)
#define DSI_STATUS_OVERFLOW (1 << 8)
#define DSI_INIT_SEQ_CONTROL 0x1a #define DSI_INIT_SEQ_CONTROL 0x1a
#define DSI_INIT_SEQ_DATA_0 0x1b #define DSI_INIT_SEQ_DATA_0 0x1b
#define DSI_INIT_SEQ_DATA_1 0x1c #define DSI_INIT_SEQ_DATA_1 0x1c
...@@ -104,6 +115,7 @@ ...@@ -104,6 +115,7 @@
#define DSI_PAD_CONTROL_3 0x51 #define DSI_PAD_CONTROL_3 0x51
#define DSI_PAD_CONTROL_4 0x52 #define DSI_PAD_CONTROL_4 0x52
#define DSI_GANGED_MODE_CONTROL 0x53 #define DSI_GANGED_MODE_CONTROL 0x53
#define DSI_GANGED_MODE_CONTROL_ENABLE (1 << 0)
#define DSI_GANGED_MODE_START 0x54 #define DSI_GANGED_MODE_START 0x54
#define DSI_GANGED_MODE_SIZE 0x55 #define DSI_GANGED_MODE_SIZE 0x55
#define DSI_RAW_DATA_BYTE_COUNT 0x56 #define DSI_RAW_DATA_BYTE_COUNT 0x56
......
...@@ -65,8 +65,12 @@ static void tegra_fb_destroy(struct drm_framebuffer *framebuffer) ...@@ -65,8 +65,12 @@ static void tegra_fb_destroy(struct drm_framebuffer *framebuffer)
for (i = 0; i < fb->num_planes; i++) { for (i = 0; i < fb->num_planes; i++) {
struct tegra_bo *bo = fb->planes[i]; struct tegra_bo *bo = fb->planes[i];
if (bo) if (bo) {
if (bo->pages && bo->vaddr)
vunmap(bo->vaddr);
drm_gem_object_unreference_unlocked(&bo->gem); drm_gem_object_unreference_unlocked(&bo->gem);
}
} }
drm_framebuffer_cleanup(framebuffer); drm_framebuffer_cleanup(framebuffer);
...@@ -223,14 +227,16 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper, ...@@ -223,14 +227,16 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper,
info = framebuffer_alloc(0, drm->dev); info = framebuffer_alloc(0, drm->dev);
if (!info) { if (!info) {
dev_err(drm->dev, "failed to allocate framebuffer info\n"); dev_err(drm->dev, "failed to allocate framebuffer info\n");
tegra_bo_free_object(&bo->gem); drm_gem_object_unreference_unlocked(&bo->gem);
return -ENOMEM; return -ENOMEM;
} }
fbdev->fb = tegra_fb_alloc(drm, &cmd, &bo, 1); fbdev->fb = tegra_fb_alloc(drm, &cmd, &bo, 1);
if (IS_ERR(fbdev->fb)) { if (IS_ERR(fbdev->fb)) {
dev_err(drm->dev, "failed to allocate DRM framebuffer\n");
err = PTR_ERR(fbdev->fb); err = PTR_ERR(fbdev->fb);
dev_err(drm->dev, "failed to allocate DRM framebuffer: %d\n",
err);
drm_gem_object_unreference_unlocked(&bo->gem);
goto release; goto release;
} }
...@@ -254,6 +260,16 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper, ...@@ -254,6 +260,16 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper,
offset = info->var.xoffset * bytes_per_pixel + offset = info->var.xoffset * bytes_per_pixel +
info->var.yoffset * fb->pitches[0]; info->var.yoffset * fb->pitches[0];
if (bo->pages) {
bo->vaddr = vmap(bo->pages, bo->num_pages, VM_MAP,
pgprot_writecombine(PAGE_KERNEL));
if (!bo->vaddr) {
dev_err(drm->dev, "failed to vmap() framebuffer\n");
err = -ENOMEM;
goto destroy;
}
}
drm->mode_config.fb_base = (resource_size_t)bo->paddr; drm->mode_config.fb_base = (resource_size_t)bo->paddr;
info->screen_base = (void __iomem *)bo->vaddr + offset; info->screen_base = (void __iomem *)bo->vaddr + offset;
info->screen_size = size; info->screen_size = size;
...@@ -289,6 +305,11 @@ static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm) ...@@ -289,6 +305,11 @@ static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm)
return fbdev; return fbdev;
} }
static void tegra_fbdev_free(struct tegra_fbdev *fbdev)
{
kfree(fbdev);
}
static int tegra_fbdev_init(struct tegra_fbdev *fbdev, static int tegra_fbdev_init(struct tegra_fbdev *fbdev,
unsigned int preferred_bpp, unsigned int preferred_bpp,
unsigned int num_crtc, unsigned int num_crtc,
...@@ -299,19 +320,21 @@ static int tegra_fbdev_init(struct tegra_fbdev *fbdev, ...@@ -299,19 +320,21 @@ static int tegra_fbdev_init(struct tegra_fbdev *fbdev,
err = drm_fb_helper_init(drm, &fbdev->base, num_crtc, max_connectors); err = drm_fb_helper_init(drm, &fbdev->base, num_crtc, max_connectors);
if (err < 0) { if (err < 0) {
dev_err(drm->dev, "failed to initialize DRM FB helper\n"); dev_err(drm->dev, "failed to initialize DRM FB helper: %d\n",
err);
return err; return err;
} }
err = drm_fb_helper_single_add_all_connectors(&fbdev->base); err = drm_fb_helper_single_add_all_connectors(&fbdev->base);
if (err < 0) { if (err < 0) {
dev_err(drm->dev, "failed to add connectors\n"); dev_err(drm->dev, "failed to add connectors: %d\n", err);
goto fini; goto fini;
} }
err = drm_fb_helper_initial_config(&fbdev->base, preferred_bpp); err = drm_fb_helper_initial_config(&fbdev->base, preferred_bpp);
if (err < 0) { if (err < 0) {
dev_err(drm->dev, "failed to set initial configuration\n"); dev_err(drm->dev, "failed to set initial configuration: %d\n",
err);
goto fini; goto fini;
} }
...@@ -322,7 +345,7 @@ static int tegra_fbdev_init(struct tegra_fbdev *fbdev, ...@@ -322,7 +345,7 @@ static int tegra_fbdev_init(struct tegra_fbdev *fbdev,
return err; return err;
} }
static void tegra_fbdev_free(struct tegra_fbdev *fbdev) static void tegra_fbdev_exit(struct tegra_fbdev *fbdev)
{ {
struct fb_info *info = fbdev->base.fbdev; struct fb_info *info = fbdev->base.fbdev;
...@@ -341,11 +364,11 @@ static void tegra_fbdev_free(struct tegra_fbdev *fbdev) ...@@ -341,11 +364,11 @@ static void tegra_fbdev_free(struct tegra_fbdev *fbdev)
if (fbdev->fb) { if (fbdev->fb) {
drm_framebuffer_unregister_private(&fbdev->fb->base); drm_framebuffer_unregister_private(&fbdev->fb->base);
tegra_fb_destroy(&fbdev->fb->base); drm_framebuffer_remove(&fbdev->fb->base);
} }
drm_fb_helper_fini(&fbdev->base); drm_fb_helper_fini(&fbdev->base);
kfree(fbdev); tegra_fbdev_free(fbdev);
} }
void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev) void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev)
...@@ -393,6 +416,15 @@ int tegra_drm_fb_prepare(struct drm_device *drm) ...@@ -393,6 +416,15 @@ int tegra_drm_fb_prepare(struct drm_device *drm)
return 0; return 0;
} }
void tegra_drm_fb_free(struct drm_device *drm)
{
#ifdef CONFIG_DRM_TEGRA_FBDEV
struct tegra_drm *tegra = drm->dev_private;
tegra_fbdev_free(tegra->fbdev);
#endif
}
int tegra_drm_fb_init(struct drm_device *drm) int tegra_drm_fb_init(struct drm_device *drm)
{ {
#ifdef CONFIG_DRM_TEGRA_FBDEV #ifdef CONFIG_DRM_TEGRA_FBDEV
...@@ -413,6 +445,6 @@ void tegra_drm_fb_exit(struct drm_device *drm) ...@@ -413,6 +445,6 @@ void tegra_drm_fb_exit(struct drm_device *drm)
#ifdef CONFIG_DRM_TEGRA_FBDEV #ifdef CONFIG_DRM_TEGRA_FBDEV
struct tegra_drm *tegra = drm->dev_private; struct tegra_drm *tegra = drm->dev_private;
tegra_fbdev_free(tegra->fbdev); tegra_fbdev_exit(tegra->fbdev);
#endif #endif
} }
This diff is collapsed.
...@@ -38,6 +38,12 @@ struct tegra_bo { ...@@ -38,6 +38,12 @@ struct tegra_bo {
dma_addr_t paddr; dma_addr_t paddr;
void *vaddr; void *vaddr;
struct drm_mm_node *mm;
unsigned long num_pages;
struct page **pages;
/* size of IOMMU mapping */
size_t size;
struct tegra_bo_tiling tiling; struct tegra_bo_tiling tiling;
}; };
...@@ -46,18 +52,18 @@ static inline struct tegra_bo *to_tegra_bo(struct drm_gem_object *gem) ...@@ -46,18 +52,18 @@ static inline struct tegra_bo *to_tegra_bo(struct drm_gem_object *gem)
return container_of(gem, struct tegra_bo, gem); return container_of(gem, struct tegra_bo, gem);
} }
struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size, struct tegra_bo *tegra_bo_create(struct drm_device *drm, size_t size,
unsigned long flags); unsigned long flags);
struct tegra_bo *tegra_bo_create_with_handle(struct drm_file *file, struct tegra_bo *tegra_bo_create_with_handle(struct drm_file *file,
struct drm_device *drm, struct drm_device *drm,
unsigned int size, size_t size,
unsigned long flags, unsigned long flags,
unsigned int *handle); u32 *handle);
void tegra_bo_free_object(struct drm_gem_object *gem); void tegra_bo_free_object(struct drm_gem_object *gem);
int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm, int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm,
struct drm_mode_create_dumb *args); struct drm_mode_create_dumb *args);
int tegra_bo_dumb_map_offset(struct drm_file *file, struct drm_device *drm, int tegra_bo_dumb_map_offset(struct drm_file *file, struct drm_device *drm,
uint32_t handle, uint64_t *offset); u32 handle, u64 *offset);
int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma); int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma);
......
...@@ -157,22 +157,18 @@ static bool tegra_encoder_mode_fixup(struct drm_encoder *encoder, ...@@ -157,22 +157,18 @@ static bool tegra_encoder_mode_fixup(struct drm_encoder *encoder,
static void tegra_encoder_prepare(struct drm_encoder *encoder) static void tegra_encoder_prepare(struct drm_encoder *encoder)
{ {
tegra_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
} }
static void tegra_encoder_commit(struct drm_encoder *encoder) static void tegra_encoder_commit(struct drm_encoder *encoder)
{ {
tegra_encoder_dpms(encoder, DRM_MODE_DPMS_ON);
} }
static void tegra_encoder_mode_set(struct drm_encoder *encoder, static void tegra_encoder_mode_set(struct drm_encoder *encoder,
struct drm_display_mode *mode, struct drm_display_mode *mode,
struct drm_display_mode *adjusted) struct drm_display_mode *adjusted)
{ {
struct tegra_output *output = encoder_to_output(encoder);
int err;
err = tegra_output_enable(output);
if (err < 0)
dev_err(encoder->dev->dev, "tegra_output_enable(): %d\n", err);
} }
static const struct drm_encoder_helper_funcs encoder_helper_funcs = { static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
...@@ -187,7 +183,8 @@ static irqreturn_t hpd_irq(int irq, void *data) ...@@ -187,7 +183,8 @@ static irqreturn_t hpd_irq(int irq, void *data)
{ {
struct tegra_output *output = data; struct tegra_output *output = data;
drm_helper_hpd_irq_event(output->connector.dev); if (output->connector.dev)
drm_helper_hpd_irq_event(output->connector.dev);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -259,6 +256,13 @@ int tegra_output_probe(struct tegra_output *output) ...@@ -259,6 +256,13 @@ int tegra_output_probe(struct tegra_output *output)
} }
output->connector.polled = DRM_CONNECTOR_POLL_HPD; output->connector.polled = DRM_CONNECTOR_POLL_HPD;
/*
* Disable the interrupt until the connector has been
* initialized to avoid a race in the hotplug interrupt
* handler.
*/
disable_irq(output->hpd_irq);
} }
return 0; return 0;
...@@ -324,10 +328,27 @@ int tegra_output_init(struct drm_device *drm, struct tegra_output *output) ...@@ -324,10 +328,27 @@ int tegra_output_init(struct drm_device *drm, struct tegra_output *output)
output->encoder.possible_crtcs = 0x3; output->encoder.possible_crtcs = 0x3;
/*
* The connector is now registered and ready to receive hotplug events
* so the hotplug interrupt can be enabled.
*/
if (gpio_is_valid(output->hpd_gpio))
enable_irq(output->hpd_irq);
return 0; return 0;
} }
int tegra_output_exit(struct tegra_output *output) int tegra_output_exit(struct tegra_output *output)
{ {
/*
* The connector is going away, so the interrupt must be disabled to
* prevent the hotplug interrupt handler from potentially crashing.
*/
if (gpio_is_valid(output->hpd_gpio))
disable_irq(output->hpd_irq);
if (output->panel)
drm_panel_detach(output->panel);
return 0; return 0;
} }
...@@ -97,7 +97,7 @@ static int host1x_pushbuffer_init(struct push_buffer *pb) ...@@ -97,7 +97,7 @@ static int host1x_pushbuffer_init(struct push_buffer *pb)
static void host1x_pushbuffer_push(struct push_buffer *pb, u32 op1, u32 op2) static void host1x_pushbuffer_push(struct push_buffer *pb, u32 op1, u32 op2)
{ {
u32 pos = pb->pos; u32 pos = pb->pos;
u32 *p = (u32 *)((u32)pb->mapped + pos); u32 *p = (u32 *)((void *)pb->mapped + pos);
WARN_ON(pos == pb->fence); WARN_ON(pos == pb->fence);
*(p++) = op1; *(p++) = op1;
*(p++) = op2; *(p++) = op2;
......
...@@ -42,7 +42,7 @@ struct host1x_job; ...@@ -42,7 +42,7 @@ struct host1x_job;
*/ */
struct push_buffer { struct push_buffer {
u32 *mapped; /* mapped pushbuffer memory */ void *mapped; /* mapped pushbuffer memory */
dma_addr_t phys; /* physical address of pushbuffer */ dma_addr_t phys; /* physical address of pushbuffer */
u32 fence; /* index we've written */ u32 fence; /* index we've written */
u32 pos; /* index to write to */ u32 pos; /* index to write to */
......
...@@ -26,11 +26,11 @@ ...@@ -26,11 +26,11 @@
#include "../debug.h" #include "../debug.h"
/* /*
* Put the restart at the end of pushbuffer memor * Put the restart at the end of pushbuffer memory
*/ */
static void push_buffer_init(struct push_buffer *pb) static void push_buffer_init(struct push_buffer *pb)
{ {
*(pb->mapped + (pb->size_bytes >> 2)) = host1x_opcode_restart(0); *(u32 *)(pb->mapped + pb->size_bytes) = host1x_opcode_restart(0);
} }
/* /*
...@@ -51,11 +51,11 @@ static void cdma_timeout_cpu_incr(struct host1x_cdma *cdma, u32 getptr, ...@@ -51,11 +51,11 @@ static void cdma_timeout_cpu_incr(struct host1x_cdma *cdma, u32 getptr,
/* NOP all the PB slots */ /* NOP all the PB slots */
while (nr_slots--) { while (nr_slots--) {
u32 *p = (u32 *)((u32)pb->mapped + getptr); u32 *p = (u32 *)(pb->mapped + getptr);
*(p++) = HOST1X_OPCODE_NOP; *(p++) = HOST1X_OPCODE_NOP;
*(p++) = HOST1X_OPCODE_NOP; *(p++) = HOST1X_OPCODE_NOP;
dev_dbg(host1x->dev, "%s: NOP at %#llx\n", __func__, dev_dbg(host1x->dev, "%s: NOP at %pad+%#x\n", __func__,
(u64)pb->phys + getptr); &pb->phys, getptr);
getptr = (getptr + 8) & (pb->size_bytes - 1); getptr = (getptr + 8) & (pb->size_bytes - 1);
} }
wmb(); wmb();
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
static void trace_write_gather(struct host1x_cdma *cdma, struct host1x_bo *bo, static void trace_write_gather(struct host1x_cdma *cdma, struct host1x_bo *bo,
u32 offset, u32 words) u32 offset, u32 words)
{ {
struct device *dev = cdma_to_channel(cdma)->dev;
void *mem = NULL; void *mem = NULL;
if (host1x_debug_trace_cmdbuf) if (host1x_debug_trace_cmdbuf)
...@@ -44,11 +45,14 @@ static void trace_write_gather(struct host1x_cdma *cdma, struct host1x_bo *bo, ...@@ -44,11 +45,14 @@ static void trace_write_gather(struct host1x_cdma *cdma, struct host1x_bo *bo,
* of how much you can output to ftrace at once. * of how much you can output to ftrace at once.
*/ */
for (i = 0; i < words; i += TRACE_MAX_LENGTH) { for (i = 0; i < words; i += TRACE_MAX_LENGTH) {
trace_host1x_cdma_push_gather( u32 num_words = min(words - i, TRACE_MAX_LENGTH);
dev_name(cdma_to_channel(cdma)->dev), offset += i * sizeof(u32);
(u32)bo, min(words - i, TRACE_MAX_LENGTH),
offset + i * sizeof(u32), mem); trace_host1x_cdma_push_gather(dev_name(dev), bo,
num_words, offset,
mem);
} }
host1x_bo_munmap(bo, mem); host1x_bo_munmap(bo, mem);
} }
} }
......
...@@ -163,8 +163,8 @@ static void show_channel_gathers(struct output *o, struct host1x_cdma *cdma) ...@@ -163,8 +163,8 @@ static void show_channel_gathers(struct output *o, struct host1x_cdma *cdma)
continue; continue;
} }
host1x_debug_output(o, " GATHER at %#llx+%04x, %d words\n", host1x_debug_output(o, " GATHER at %pad+%#x, %d words\n",
(u64)g->base, g->offset, g->words); &g->base, g->offset, g->words);
show_gather(o, g->base + g->offset, g->words, cdma, show_gather(o, g->base + g->offset, g->words, cdma,
g->base, mapped); g->base, mapped);
......
...@@ -23,7 +23,7 @@ struct host1x_job_gather { ...@@ -23,7 +23,7 @@ struct host1x_job_gather {
u32 words; u32 words;
dma_addr_t base; dma_addr_t base;
struct host1x_bo *bo; struct host1x_bo *bo;
int offset; u32 offset;
bool handled; bool handled;
}; };
......
...@@ -49,35 +49,47 @@ ...@@ -49,35 +49,47 @@
#define MIPI_CAL_CONFIG_DSIC 0x10 #define MIPI_CAL_CONFIG_DSIC 0x10
#define MIPI_CAL_CONFIG_DSID 0x11 #define MIPI_CAL_CONFIG_DSID 0x11
#define MIPI_CAL_CONFIG_DSIAB_CLK 0x19
#define MIPI_CAL_CONFIG_DSICD_CLK 0x1a
#define MIPI_CAL_CONFIG_CSIAB_CLK 0x1b
#define MIPI_CAL_CONFIG_CSICD_CLK 0x1c
#define MIPI_CAL_CONFIG_CSIE_CLK 0x1d
/* for data and clock lanes */
#define MIPI_CAL_CONFIG_SELECT (1 << 21) #define MIPI_CAL_CONFIG_SELECT (1 << 21)
/* for data lanes */
#define MIPI_CAL_CONFIG_HSPDOS(x) (((x) & 0x1f) << 16) #define MIPI_CAL_CONFIG_HSPDOS(x) (((x) & 0x1f) << 16)
#define MIPI_CAL_CONFIG_HSPUOS(x) (((x) & 0x1f) << 8) #define MIPI_CAL_CONFIG_HSPUOS(x) (((x) & 0x1f) << 8)
#define MIPI_CAL_CONFIG_TERMOS(x) (((x) & 0x1f) << 0) #define MIPI_CAL_CONFIG_TERMOS(x) (((x) & 0x1f) << 0)
/* for clock lanes */
#define MIPI_CAL_CONFIG_HSCLKPDOSD(x) (((x) & 0x1f) << 8)
#define MIPI_CAL_CONFIG_HSCLKPUOSD(x) (((x) & 0x1f) << 0)
#define MIPI_CAL_BIAS_PAD_CFG0 0x16 #define MIPI_CAL_BIAS_PAD_CFG0 0x16
#define MIPI_CAL_BIAS_PAD_PDVCLAMP (1 << 1) #define MIPI_CAL_BIAS_PAD_PDVCLAMP (1 << 1)
#define MIPI_CAL_BIAS_PAD_E_VCLAMP_REF (1 << 0) #define MIPI_CAL_BIAS_PAD_E_VCLAMP_REF (1 << 0)
#define MIPI_CAL_BIAS_PAD_CFG1 0x17 #define MIPI_CAL_BIAS_PAD_CFG1 0x17
#define MIPI_CAL_BIAS_PAD_DRV_DN_REF(x) (((x) & 0x7) << 16)
#define MIPI_CAL_BIAS_PAD_CFG2 0x18 #define MIPI_CAL_BIAS_PAD_CFG2 0x18
#define MIPI_CAL_BIAS_PAD_PDVREG (1 << 1) #define MIPI_CAL_BIAS_PAD_PDVREG (1 << 1)
static const struct module { struct tegra_mipi_pad {
unsigned long reg; unsigned long data;
} modules[] = { unsigned long clk;
{ .reg = MIPI_CAL_CONFIG_CSIA }, };
{ .reg = MIPI_CAL_CONFIG_CSIB },
{ .reg = MIPI_CAL_CONFIG_CSIC }, struct tegra_mipi_soc {
{ .reg = MIPI_CAL_CONFIG_CSID }, bool has_clk_lane;
{ .reg = MIPI_CAL_CONFIG_CSIE }, const struct tegra_mipi_pad *pads;
{ .reg = MIPI_CAL_CONFIG_DSIA }, unsigned int num_pads;
{ .reg = MIPI_CAL_CONFIG_DSIB },
{ .reg = MIPI_CAL_CONFIG_DSIC },
{ .reg = MIPI_CAL_CONFIG_DSID },
}; };
struct tegra_mipi { struct tegra_mipi {
const struct tegra_mipi_soc *soc;
void __iomem *regs; void __iomem *regs;
struct mutex lock; struct mutex lock;
struct clk *clk; struct clk *clk;
...@@ -90,16 +102,16 @@ struct tegra_mipi_device { ...@@ -90,16 +102,16 @@ struct tegra_mipi_device {
unsigned long pads; unsigned long pads;
}; };
static inline unsigned long tegra_mipi_readl(struct tegra_mipi *mipi, static inline u32 tegra_mipi_readl(struct tegra_mipi *mipi,
unsigned long reg) unsigned long offset)
{ {
return readl(mipi->regs + (reg << 2)); return readl(mipi->regs + (offset << 2));
} }
static inline void tegra_mipi_writel(struct tegra_mipi *mipi, static inline void tegra_mipi_writel(struct tegra_mipi *mipi, u32 value,
unsigned long value, unsigned long reg) unsigned long offset)
{ {
writel(value, mipi->regs + (reg << 2)); writel(value, mipi->regs + (offset << 2));
} }
struct tegra_mipi_device *tegra_mipi_request(struct device *device) struct tegra_mipi_device *tegra_mipi_request(struct device *device)
...@@ -117,36 +129,35 @@ struct tegra_mipi_device *tegra_mipi_request(struct device *device) ...@@ -117,36 +129,35 @@ struct tegra_mipi_device *tegra_mipi_request(struct device *device)
dev = kzalloc(sizeof(*dev), GFP_KERNEL); dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev) { if (!dev) {
of_node_put(args.np);
err = -ENOMEM; err = -ENOMEM;
goto out; goto out;
} }
dev->pdev = of_find_device_by_node(args.np); dev->pdev = of_find_device_by_node(args.np);
if (!dev->pdev) { if (!dev->pdev) {
of_node_put(args.np);
err = -ENODEV; err = -ENODEV;
goto free; goto free;
} }
of_node_put(args.np);
dev->mipi = platform_get_drvdata(dev->pdev); dev->mipi = platform_get_drvdata(dev->pdev);
if (!dev->mipi) { if (!dev->mipi) {
err = -EPROBE_DEFER; err = -EPROBE_DEFER;
goto pdev_put; goto put;
} }
of_node_put(args.np);
dev->pads = args.args[0]; dev->pads = args.args[0];
dev->device = device; dev->device = device;
return dev; return dev;
pdev_put: put:
platform_device_put(dev->pdev); platform_device_put(dev->pdev);
free: free:
kfree(dev); kfree(dev);
out: out:
of_node_put(args.np);
return ERR_PTR(err); return ERR_PTR(err);
} }
EXPORT_SYMBOL(tegra_mipi_request); EXPORT_SYMBOL(tegra_mipi_request);
...@@ -161,7 +172,7 @@ EXPORT_SYMBOL(tegra_mipi_free); ...@@ -161,7 +172,7 @@ EXPORT_SYMBOL(tegra_mipi_free);
static int tegra_mipi_wait(struct tegra_mipi *mipi) static int tegra_mipi_wait(struct tegra_mipi *mipi)
{ {
unsigned long timeout = jiffies + msecs_to_jiffies(250); unsigned long timeout = jiffies + msecs_to_jiffies(250);
unsigned long value; u32 value;
while (time_before(jiffies, timeout)) { while (time_before(jiffies, timeout)) {
value = tegra_mipi_readl(mipi, MIPI_CAL_STATUS); value = tegra_mipi_readl(mipi, MIPI_CAL_STATUS);
...@@ -177,8 +188,9 @@ static int tegra_mipi_wait(struct tegra_mipi *mipi) ...@@ -177,8 +188,9 @@ static int tegra_mipi_wait(struct tegra_mipi *mipi)
int tegra_mipi_calibrate(struct tegra_mipi_device *device) int tegra_mipi_calibrate(struct tegra_mipi_device *device)
{ {
unsigned long value; const struct tegra_mipi_soc *soc = device->mipi->soc;
unsigned int i; unsigned int i;
u32 value;
int err; int err;
err = clk_enable(device->mipi->clk); err = clk_enable(device->mipi->clk);
...@@ -192,23 +204,35 @@ int tegra_mipi_calibrate(struct tegra_mipi_device *device) ...@@ -192,23 +204,35 @@ int tegra_mipi_calibrate(struct tegra_mipi_device *device)
value |= MIPI_CAL_BIAS_PAD_E_VCLAMP_REF; value |= MIPI_CAL_BIAS_PAD_E_VCLAMP_REF;
tegra_mipi_writel(device->mipi, value, MIPI_CAL_BIAS_PAD_CFG0); tegra_mipi_writel(device->mipi, value, MIPI_CAL_BIAS_PAD_CFG0);
tegra_mipi_writel(device->mipi, MIPI_CAL_BIAS_PAD_DRV_DN_REF(2),
MIPI_CAL_BIAS_PAD_CFG1);
value = tegra_mipi_readl(device->mipi, MIPI_CAL_BIAS_PAD_CFG2); value = tegra_mipi_readl(device->mipi, MIPI_CAL_BIAS_PAD_CFG2);
value &= ~MIPI_CAL_BIAS_PAD_PDVREG; value &= ~MIPI_CAL_BIAS_PAD_PDVREG;
tegra_mipi_writel(device->mipi, value, MIPI_CAL_BIAS_PAD_CFG2); tegra_mipi_writel(device->mipi, value, MIPI_CAL_BIAS_PAD_CFG2);
for (i = 0; i < ARRAY_SIZE(modules); i++) { for (i = 0; i < soc->num_pads; i++) {
if (device->pads & BIT(i)) u32 clk = 0, data = 0;
value = MIPI_CAL_CONFIG_SELECT |
MIPI_CAL_CONFIG_HSPDOS(0) | if (device->pads & BIT(i)) {
MIPI_CAL_CONFIG_HSPUOS(4) | data = MIPI_CAL_CONFIG_SELECT |
MIPI_CAL_CONFIG_TERMOS(5); MIPI_CAL_CONFIG_HSPDOS(0) |
else MIPI_CAL_CONFIG_HSPUOS(4) |
value = 0; MIPI_CAL_CONFIG_TERMOS(5);
clk = MIPI_CAL_CONFIG_SELECT |
MIPI_CAL_CONFIG_HSCLKPDOSD(0) |
MIPI_CAL_CONFIG_HSCLKPUOSD(4);
}
tegra_mipi_writel(device->mipi, value, modules[i].reg); tegra_mipi_writel(device->mipi, data, soc->pads[i].data);
if (soc->has_clk_lane)
tegra_mipi_writel(device->mipi, clk, soc->pads[i].clk);
} }
tegra_mipi_writel(device->mipi, MIPI_CAL_CTRL_START, MIPI_CAL_CTRL); value = tegra_mipi_readl(device->mipi, MIPI_CAL_CTRL);
value |= MIPI_CAL_CTRL_START;
tegra_mipi_writel(device->mipi, value, MIPI_CAL_CTRL);
err = tegra_mipi_wait(device->mipi); err = tegra_mipi_wait(device->mipi);
...@@ -219,16 +243,63 @@ int tegra_mipi_calibrate(struct tegra_mipi_device *device) ...@@ -219,16 +243,63 @@ int tegra_mipi_calibrate(struct tegra_mipi_device *device)
} }
EXPORT_SYMBOL(tegra_mipi_calibrate); EXPORT_SYMBOL(tegra_mipi_calibrate);
static const struct tegra_mipi_pad tegra114_mipi_pads[] = {
{ .data = MIPI_CAL_CONFIG_CSIA },
{ .data = MIPI_CAL_CONFIG_CSIB },
{ .data = MIPI_CAL_CONFIG_CSIC },
{ .data = MIPI_CAL_CONFIG_CSID },
{ .data = MIPI_CAL_CONFIG_CSIE },
{ .data = MIPI_CAL_CONFIG_DSIA },
{ .data = MIPI_CAL_CONFIG_DSIB },
{ .data = MIPI_CAL_CONFIG_DSIC },
{ .data = MIPI_CAL_CONFIG_DSID },
};
static const struct tegra_mipi_soc tegra114_mipi_soc = {
.has_clk_lane = false,
.pads = tegra114_mipi_pads,
.num_pads = ARRAY_SIZE(tegra114_mipi_pads),
};
static const struct tegra_mipi_pad tegra124_mipi_pads[] = {
{ .data = MIPI_CAL_CONFIG_CSIA, .clk = MIPI_CAL_CONFIG_CSIAB_CLK },
{ .data = MIPI_CAL_CONFIG_CSIB, .clk = MIPI_CAL_CONFIG_CSIAB_CLK },
{ .data = MIPI_CAL_CONFIG_CSIC, .clk = MIPI_CAL_CONFIG_CSICD_CLK },
{ .data = MIPI_CAL_CONFIG_CSID, .clk = MIPI_CAL_CONFIG_CSICD_CLK },
{ .data = MIPI_CAL_CONFIG_CSIE, .clk = MIPI_CAL_CONFIG_CSIE_CLK },
{ .data = MIPI_CAL_CONFIG_DSIA, .clk = MIPI_CAL_CONFIG_DSIAB_CLK },
{ .data = MIPI_CAL_CONFIG_DSIB, .clk = MIPI_CAL_CONFIG_DSIAB_CLK },
};
static const struct tegra_mipi_soc tegra124_mipi_soc = {
.has_clk_lane = true,
.pads = tegra124_mipi_pads,
.num_pads = ARRAY_SIZE(tegra124_mipi_pads),
};
static struct of_device_id tegra_mipi_of_match[] = {
{ .compatible = "nvidia,tegra114-mipi", .data = &tegra114_mipi_soc },
{ .compatible = "nvidia,tegra124-mipi", .data = &tegra124_mipi_soc },
{ },
};
static int tegra_mipi_probe(struct platform_device *pdev) static int tegra_mipi_probe(struct platform_device *pdev)
{ {
const struct of_device_id *match;
struct tegra_mipi *mipi; struct tegra_mipi *mipi;
struct resource *res; struct resource *res;
int err; int err;
match = of_match_node(tegra_mipi_of_match, pdev->dev.of_node);
if (!match)
return -ENODEV;
mipi = devm_kzalloc(&pdev->dev, sizeof(*mipi), GFP_KERNEL); mipi = devm_kzalloc(&pdev->dev, sizeof(*mipi), GFP_KERNEL);
if (!mipi) if (!mipi)
return -ENOMEM; return -ENOMEM;
mipi->soc = match->data;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mipi->regs = devm_ioremap_resource(&pdev->dev, res); mipi->regs = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(mipi->regs)) if (IS_ERR(mipi->regs))
...@@ -260,11 +331,6 @@ static int tegra_mipi_remove(struct platform_device *pdev) ...@@ -260,11 +331,6 @@ static int tegra_mipi_remove(struct platform_device *pdev)
return 0; return 0;
} }
static struct of_device_id tegra_mipi_of_match[] = {
{ .compatible = "nvidia,tegra114-mipi", },
{ },
};
struct platform_driver tegra_mipi_driver = { struct platform_driver tegra_mipi_driver = {
.driver = { .driver = {
.name = "tegra-mipi", .name = "tegra-mipi",
......
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#include <linux/ktime.h> #include <linux/ktime.h>
#include <linux/tracepoint.h> #include <linux/tracepoint.h>
struct host1x_bo;
DECLARE_EVENT_CLASS(host1x, DECLARE_EVENT_CLASS(host1x,
TP_PROTO(const char *name), TP_PROTO(const char *name),
TP_ARGS(name), TP_ARGS(name),
...@@ -79,14 +81,14 @@ TRACE_EVENT(host1x_cdma_push, ...@@ -79,14 +81,14 @@ TRACE_EVENT(host1x_cdma_push,
); );
TRACE_EVENT(host1x_cdma_push_gather, TRACE_EVENT(host1x_cdma_push_gather,
TP_PROTO(const char *name, u32 mem_id, TP_PROTO(const char *name, struct host1x_bo *bo,
u32 words, u32 offset, void *cmdbuf), u32 words, u32 offset, void *cmdbuf),
TP_ARGS(name, mem_id, words, offset, cmdbuf), TP_ARGS(name, bo, words, offset, cmdbuf),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(const char *, name) __field(const char *, name)
__field(u32, mem_id) __field(struct host1x_bo *, bo)
__field(u32, words) __field(u32, words)
__field(u32, offset) __field(u32, offset)
__field(bool, cmdbuf) __field(bool, cmdbuf)
...@@ -100,13 +102,13 @@ TRACE_EVENT(host1x_cdma_push_gather, ...@@ -100,13 +102,13 @@ TRACE_EVENT(host1x_cdma_push_gather,
} }
__entry->cmdbuf = cmdbuf; __entry->cmdbuf = cmdbuf;
__entry->name = name; __entry->name = name;
__entry->mem_id = mem_id; __entry->bo = bo;
__entry->words = words; __entry->words = words;
__entry->offset = offset; __entry->offset = offset;
), ),
TP_printk("name=%s, mem_id=%08x, words=%u, offset=%d, contents=[%s]", TP_printk("name=%s, bo=%p, words=%u, offset=%d, contents=[%s]",
__entry->name, __entry->mem_id, __entry->name, __entry->bo,
__entry->words, __entry->offset, __entry->words, __entry->offset,
__print_hex(__get_dynamic_array(cmdbuf), __print_hex(__get_dynamic_array(cmdbuf),
__entry->cmdbuf ? __entry->words * 4 : 0)) __entry->cmdbuf ? __entry->words * 4 : 0))
...@@ -221,12 +223,13 @@ TRACE_EVENT(host1x_syncpt_load_min, ...@@ -221,12 +223,13 @@ TRACE_EVENT(host1x_syncpt_load_min,
); );
TRACE_EVENT(host1x_syncpt_wait_check, TRACE_EVENT(host1x_syncpt_wait_check,
TP_PROTO(void *mem_id, u32 offset, u32 syncpt_id, u32 thresh, u32 min), TP_PROTO(struct host1x_bo *bo, u32 offset, u32 syncpt_id, u32 thresh,
u32 min),
TP_ARGS(mem_id, offset, syncpt_id, thresh, min), TP_ARGS(bo, offset, syncpt_id, thresh, min),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(void *, mem_id) __field(struct host1x_bo *, bo)
__field(u32, offset) __field(u32, offset)
__field(u32, syncpt_id) __field(u32, syncpt_id)
__field(u32, thresh) __field(u32, thresh)
...@@ -234,15 +237,15 @@ TRACE_EVENT(host1x_syncpt_wait_check, ...@@ -234,15 +237,15 @@ TRACE_EVENT(host1x_syncpt_wait_check,
), ),
TP_fast_assign( TP_fast_assign(
__entry->mem_id = mem_id; __entry->bo = bo;
__entry->offset = offset; __entry->offset = offset;
__entry->syncpt_id = syncpt_id; __entry->syncpt_id = syncpt_id;
__entry->thresh = thresh; __entry->thresh = thresh;
__entry->min = min; __entry->min = min;
), ),
TP_printk("mem_id=%p, offset=%05x, id=%d, thresh=%d, current=%d", TP_printk("bo=%p, offset=%05x, id=%d, thresh=%d, current=%d",
__entry->mem_id, __entry->offset, __entry->bo, __entry->offset,
__entry->syncpt_id, __entry->thresh, __entry->syncpt_id, __entry->thresh,
__entry->min) __entry->min)
); );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment