gr2d.c (caccddcfc4b4de75930df2e8f7fd0c66556b13ff) gr2d.c (aacdf19849734d1be5e407932228ae101ba5b92f)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (c) 2012-2013, NVIDIA Corporation.
4 */
5
6#include <linux/clk.h>
7#include <linux/iommu.h>
8#include <linux/module.h>
9#include <linux/of_device.h>
10
11#include "drm.h"
12#include "gem.h"
13#include "gr2d.h"
14
15struct gr2d_soc {
16 unsigned int version;
17};
18
19struct gr2d {
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (c) 2012-2013, NVIDIA Corporation.
4 */
5
6#include <linux/clk.h>
7#include <linux/iommu.h>
8#include <linux/module.h>
9#include <linux/of_device.h>
10
11#include "drm.h"
12#include "gem.h"
13#include "gr2d.h"
14
15struct gr2d_soc {
16 unsigned int version;
17};
18
19struct gr2d {
20 struct iommu_group *group;
21 struct tegra_drm_client client;
22 struct host1x_channel *channel;
23 struct clk *clk;
24
25 const struct gr2d_soc *soc;
26
27 DECLARE_BITMAP(addr_regs, GR2D_NUM_REGS);
28};

--- 17 unchanged lines hidden (view full) ---

46
47 client->syncpts[0] = host1x_syncpt_request(client, flags);
48 if (!client->syncpts[0]) {
49 err = -ENOMEM;
50 dev_err(client->dev, "failed to request syncpoint: %d\n", err);
51 goto put;
52 }
53
20 struct tegra_drm_client client;
21 struct host1x_channel *channel;
22 struct clk *clk;
23
24 const struct gr2d_soc *soc;
25
26 DECLARE_BITMAP(addr_regs, GR2D_NUM_REGS);
27};

--- 17 unchanged lines hidden (view full) ---

45
46 client->syncpts[0] = host1x_syncpt_request(client, flags);
47 if (!client->syncpts[0]) {
48 err = -ENOMEM;
49 dev_err(client->dev, "failed to request syncpoint: %d\n", err);
50 goto put;
51 }
52
54 gr2d->group = host1x_client_iommu_attach(client, false);
55 if (IS_ERR(gr2d->group)) {
56 err = PTR_ERR(gr2d->group);
53 err = host1x_client_iommu_attach(client, false);
54 if (err < 0) {
57 dev_err(client->dev, "failed to attach to domain: %d\n", err);
58 goto free;
59 }
60
61 err = tegra_drm_register_client(dev->dev_private, drm);
62 if (err < 0) {
63 dev_err(client->dev, "failed to register client: %d\n", err);
64 goto detach;
65 }
66
67 return 0;
68
69detach:
55 dev_err(client->dev, "failed to attach to domain: %d\n", err);
56 goto free;
57 }
58
59 err = tegra_drm_register_client(dev->dev_private, drm);
60 if (err < 0) {
61 dev_err(client->dev, "failed to register client: %d\n", err);
62 goto detach;
63 }
64
65 return 0;
66
67detach:
70 host1x_client_iommu_detach(client, gr2d->group);
68 host1x_client_iommu_detach(client);
71free:
72 host1x_syncpt_free(client->syncpts[0]);
73put:
74 host1x_channel_put(gr2d->channel);
75 return err;
76}
77
78static int gr2d_exit(struct host1x_client *client)
79{
80 struct tegra_drm_client *drm = host1x_to_drm_client(client);
81 struct drm_device *dev = dev_get_drvdata(client->parent);
82 struct tegra_drm *tegra = dev->dev_private;
83 struct gr2d *gr2d = to_gr2d(drm);
84 int err;
85
86 err = tegra_drm_unregister_client(tegra, drm);
87 if (err < 0)
88 return err;
89
69free:
70 host1x_syncpt_free(client->syncpts[0]);
71put:
72 host1x_channel_put(gr2d->channel);
73 return err;
74}
75
76static int gr2d_exit(struct host1x_client *client)
77{
78 struct tegra_drm_client *drm = host1x_to_drm_client(client);
79 struct drm_device *dev = dev_get_drvdata(client->parent);
80 struct tegra_drm *tegra = dev->dev_private;
81 struct gr2d *gr2d = to_gr2d(drm);
82 int err;
83
84 err = tegra_drm_unregister_client(tegra, drm);
85 if (err < 0)
86 return err;
87
90 host1x_client_iommu_detach(client, gr2d->group);
88 host1x_client_iommu_detach(client);
91 host1x_syncpt_free(client->syncpts[0]);
92 host1x_channel_put(gr2d->channel);
93
94 return 0;
95}
96
97static const struct host1x_client_ops gr2d_client_ops = {
98 .init = gr2d_init,

--- 172 unchanged lines hidden ---
89 host1x_syncpt_free(client->syncpts[0]);
90 host1x_channel_put(gr2d->channel);
91
92 return 0;
93}
94
95static const struct host1x_client_ops gr2d_client_ops = {
96 .init = gr2d_init,

--- 172 unchanged lines hidden ---