gpu: host1x: Enable gather filter
The gather filter is a feature present on Tegra124 and newer where the hardware prevents GATHERed command buffers from executing commands normally reserved for the CDMA pushbuffer which is maintained by the kernel driver. This commit enables the gather filter on all supporting hardware. Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com> Reviewed-by: Dmitry Osipenko <digetx@gmail.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
Родитель
c3f52220f2
Коммит
2316f29fb5
|
@ -180,10 +180,32 @@ error:
|
|||
return err;
|
||||
}
|
||||
|
||||
static void enable_gather_filter(struct host1x *host,
|
||||
struct host1x_channel *ch)
|
||||
{
|
||||
#if HOST1X_HW >= 6
|
||||
u32 val;
|
||||
|
||||
if (!host->hv_regs)
|
||||
return;
|
||||
|
||||
val = host1x_hypervisor_readl(
|
||||
host, HOST1X_HV_CH_KERNEL_FILTER_GBUFFER(ch->id / 32));
|
||||
val |= BIT(ch->id % 32);
|
||||
host1x_hypervisor_writel(
|
||||
host, val, HOST1X_HV_CH_KERNEL_FILTER_GBUFFER(ch->id / 32));
|
||||
#elif HOST1X_HW >= 4
|
||||
host1x_ch_writel(ch,
|
||||
HOST1X_CHANNEL_CHANNELCTRL_KERNEL_FILTER_GBUFFER(1),
|
||||
HOST1X_CHANNEL_CHANNELCTRL);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int host1x_channel_init(struct host1x_channel *ch, struct host1x *dev,
|
||||
unsigned int index)
|
||||
{
|
||||
ch->regs = dev->regs + index * HOST1X_CHANNEL_SIZE;
|
||||
enable_gather_filter(dev, ch);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -117,5 +117,17 @@ static inline u32 host1x_channel_dmactrl_dmainitget(void)
|
|||
}
|
||||
#define HOST1X_CHANNEL_DMACTRL_DMAINITGET \
|
||||
host1x_channel_dmactrl_dmainitget()
|
||||
static inline u32 host1x_channel_channelctrl_r(void)
|
||||
{
|
||||
return 0x98;
|
||||
}
|
||||
#define HOST1X_CHANNEL_CHANNELCTRL \
|
||||
host1x_channel_channelctrl_r()
|
||||
static inline u32 host1x_channel_channelctrl_kernel_filter_gbuffer_f(u32 v)
|
||||
{
|
||||
return (v & 0x1) << 2;
|
||||
}
|
||||
#define HOST1X_CHANNEL_CHANNELCTRL_KERNEL_FILTER_GBUFFER(v) \
|
||||
host1x_channel_channelctrl_kernel_filter_gbuffer_f(v)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -117,5 +117,17 @@ static inline u32 host1x_channel_dmactrl_dmainitget(void)
|
|||
}
|
||||
#define HOST1X_CHANNEL_DMACTRL_DMAINITGET \
|
||||
host1x_channel_dmactrl_dmainitget()
|
||||
static inline u32 host1x_channel_channelctrl_r(void)
|
||||
{
|
||||
return 0x98;
|
||||
}
|
||||
#define HOST1X_CHANNEL_CHANNELCTRL \
|
||||
host1x_channel_channelctrl_r()
|
||||
static inline u32 host1x_channel_channelctrl_kernel_filter_gbuffer_f(u32 v)
|
||||
{
|
||||
return (v & 0x1) << 2;
|
||||
}
|
||||
#define HOST1X_CHANNEL_CHANNELCTRL_KERNEL_FILTER_GBUFFER(v) \
|
||||
host1x_channel_channelctrl_kernel_filter_gbuffer_f(v)
|
||||
|
||||
#endif
|
||||
|
|
Загрузка…
Ссылка в новой задаче