Commit 3446d7e9 authored by Qiang Yu's avatar Qiang Yu

drm/lima: add resume/suspend callback for each ip

For called when PM do resume/suspend.
Tested-by: default avatarBhushan Shah <bshah@kde.org>
Reviewed-by: default avatarVasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: default avatarQiang Yu <yuq825@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200421133551.31481-8-yuq825@gmail.com
parent 9f5072a1
...@@ -26,18 +26,33 @@ void lima_bcast_enable(struct lima_device *dev, int num_pp) ...@@ -26,18 +26,33 @@ void lima_bcast_enable(struct lima_device *dev, int num_pp)
bcast_write(LIMA_BCAST_BROADCAST_MASK, mask); bcast_write(LIMA_BCAST_BROADCAST_MASK, mask);
} }
static int lima_bcast_hw_init(struct lima_ip *ip)
{
bcast_write(LIMA_BCAST_BROADCAST_MASK, ip->data.mask << 16);
bcast_write(LIMA_BCAST_INTERRUPT_MASK, ip->data.mask);
return 0;
}
int lima_bcast_resume(struct lima_ip *ip)
{
return lima_bcast_hw_init(ip);
}
void lima_bcast_suspend(struct lima_ip *ip)
{
}
int lima_bcast_init(struct lima_ip *ip) int lima_bcast_init(struct lima_ip *ip)
{ {
int i, mask = 0; int i;
for (i = lima_ip_pp0; i <= lima_ip_pp7; i++) { for (i = lima_ip_pp0; i <= lima_ip_pp7; i++) {
if (ip->dev->ip[i].present) if (ip->dev->ip[i].present)
mask |= 1 << (i - lima_ip_pp0); ip->data.mask |= 1 << (i - lima_ip_pp0);
} }
bcast_write(LIMA_BCAST_BROADCAST_MASK, mask << 16); return lima_bcast_hw_init(ip);
bcast_write(LIMA_BCAST_INTERRUPT_MASK, mask);
return 0;
} }
void lima_bcast_fini(struct lima_ip *ip) void lima_bcast_fini(struct lima_ip *ip)
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
struct lima_ip; struct lima_ip;
int lima_bcast_resume(struct lima_ip *ip);
void lima_bcast_suspend(struct lima_ip *ip);
int lima_bcast_init(struct lima_ip *ip); int lima_bcast_init(struct lima_ip *ip);
void lima_bcast_fini(struct lima_ip *ip); void lima_bcast_fini(struct lima_ip *ip);
......
...@@ -25,6 +25,8 @@ struct lima_ip_desc { ...@@ -25,6 +25,8 @@ struct lima_ip_desc {
int (*init)(struct lima_ip *ip); int (*init)(struct lima_ip *ip);
void (*fini)(struct lima_ip *ip); void (*fini)(struct lima_ip *ip);
int (*resume)(struct lima_ip *ip);
void (*suspend)(struct lima_ip *ip);
}; };
#define LIMA_IP_DESC(ipname, mst0, mst1, off0, off1, func, irq) \ #define LIMA_IP_DESC(ipname, mst0, mst1, off0, off1, func, irq) \
...@@ -41,6 +43,8 @@ struct lima_ip_desc { ...@@ -41,6 +43,8 @@ struct lima_ip_desc {
}, \ }, \
.init = lima_##func##_init, \ .init = lima_##func##_init, \
.fini = lima_##func##_fini, \ .fini = lima_##func##_fini, \
.resume = lima_##func##_resume, \
.suspend = lima_##func##_suspend, \
} }
static struct lima_ip_desc lima_ip_desc[lima_ip_num] = { static struct lima_ip_desc lima_ip_desc[lima_ip_num] = {
......
...@@ -64,7 +64,7 @@ struct lima_ip { ...@@ -64,7 +64,7 @@ struct lima_ip {
bool async_reset; bool async_reset;
/* l2 cache */ /* l2 cache */
spinlock_t lock; spinlock_t lock;
/* pmu */ /* pmu/bcast */
u32 mask; u32 mask;
} data; } data;
}; };
......
...@@ -42,7 +42,7 @@ void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg) ...@@ -42,7 +42,7 @@ void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg)
dlbu_write(LIMA_DLBU_START_TILE_POS, reg[3]); dlbu_write(LIMA_DLBU_START_TILE_POS, reg[3]);
} }
int lima_dlbu_init(struct lima_ip *ip) static int lima_dlbu_hw_init(struct lima_ip *ip)
{ {
struct lima_device *dev = ip->dev; struct lima_device *dev = ip->dev;
...@@ -52,6 +52,21 @@ int lima_dlbu_init(struct lima_ip *ip) ...@@ -52,6 +52,21 @@ int lima_dlbu_init(struct lima_ip *ip)
return 0; return 0;
} }
int lima_dlbu_resume(struct lima_ip *ip)
{
return lima_dlbu_hw_init(ip);
}
void lima_dlbu_suspend(struct lima_ip *ip)
{
}
int lima_dlbu_init(struct lima_ip *ip)
{
return lima_dlbu_hw_init(ip);
}
void lima_dlbu_fini(struct lima_ip *ip) void lima_dlbu_fini(struct lima_ip *ip)
{ {
......
...@@ -12,6 +12,8 @@ void lima_dlbu_disable(struct lima_device *dev); ...@@ -12,6 +12,8 @@ void lima_dlbu_disable(struct lima_device *dev);
void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg); void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg);
int lima_dlbu_resume(struct lima_ip *ip);
void lima_dlbu_suspend(struct lima_ip *ip);
int lima_dlbu_init(struct lima_ip *ip); int lima_dlbu_init(struct lima_ip *ip);
void lima_dlbu_fini(struct lima_ip *ip); void lima_dlbu_fini(struct lima_ip *ip);
......
...@@ -274,6 +274,23 @@ static void lima_gp_print_version(struct lima_ip *ip) ...@@ -274,6 +274,23 @@ static void lima_gp_print_version(struct lima_ip *ip)
static struct kmem_cache *lima_gp_task_slab; static struct kmem_cache *lima_gp_task_slab;
static int lima_gp_task_slab_refcnt; static int lima_gp_task_slab_refcnt;
static int lima_gp_hw_init(struct lima_ip *ip)
{
ip->data.async_reset = false;
lima_gp_soft_reset_async(ip);
return lima_gp_soft_reset_async_wait(ip);
}
int lima_gp_resume(struct lima_ip *ip)
{
return lima_gp_hw_init(ip);
}
void lima_gp_suspend(struct lima_ip *ip)
{
}
int lima_gp_init(struct lima_ip *ip) int lima_gp_init(struct lima_ip *ip)
{ {
struct lima_device *dev = ip->dev; struct lima_device *dev = ip->dev;
...@@ -281,9 +298,7 @@ int lima_gp_init(struct lima_ip *ip) ...@@ -281,9 +298,7 @@ int lima_gp_init(struct lima_ip *ip)
lima_gp_print_version(ip); lima_gp_print_version(ip);
ip->data.async_reset = false; err = lima_gp_hw_init(ip);
lima_gp_soft_reset_async(ip);
err = lima_gp_soft_reset_async_wait(ip);
if (err) if (err)
return err; return err;
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
struct lima_ip; struct lima_ip;
struct lima_device; struct lima_device;
int lima_gp_resume(struct lima_ip *ip);
void lima_gp_suspend(struct lima_ip *ip);
int lima_gp_init(struct lima_ip *ip); int lima_gp_init(struct lima_ip *ip);
void lima_gp_fini(struct lima_ip *ip); void lima_gp_fini(struct lima_ip *ip);
......
...@@ -38,9 +38,35 @@ int lima_l2_cache_flush(struct lima_ip *ip) ...@@ -38,9 +38,35 @@ int lima_l2_cache_flush(struct lima_ip *ip)
return ret; return ret;
} }
static int lima_l2_cache_hw_init(struct lima_ip *ip)
{
int err;
err = lima_l2_cache_flush(ip);
if (err)
return err;
l2_cache_write(LIMA_L2_CACHE_ENABLE,
LIMA_L2_CACHE_ENABLE_ACCESS |
LIMA_L2_CACHE_ENABLE_READ_ALLOCATE);
l2_cache_write(LIMA_L2_CACHE_MAX_READS, 0x1c);
return 0;
}
int lima_l2_cache_resume(struct lima_ip *ip)
{
return lima_l2_cache_hw_init(ip);
}
void lima_l2_cache_suspend(struct lima_ip *ip)
{
}
int lima_l2_cache_init(struct lima_ip *ip) int lima_l2_cache_init(struct lima_ip *ip)
{ {
int i, err; int i;
u32 size; u32 size;
struct lima_device *dev = ip->dev; struct lima_device *dev = ip->dev;
...@@ -63,15 +89,7 @@ int lima_l2_cache_init(struct lima_ip *ip) ...@@ -63,15 +89,7 @@ int lima_l2_cache_init(struct lima_ip *ip)
1 << (size & 0xff), 1 << (size & 0xff),
1 << ((size >> 24) & 0xff)); 1 << ((size >> 24) & 0xff));
err = lima_l2_cache_flush(ip); return lima_l2_cache_hw_init(ip);
if (err)
return err;
l2_cache_write(LIMA_L2_CACHE_ENABLE,
LIMA_L2_CACHE_ENABLE_ACCESS|LIMA_L2_CACHE_ENABLE_READ_ALLOCATE);
l2_cache_write(LIMA_L2_CACHE_MAX_READS, 0x1c);
return 0;
} }
void lima_l2_cache_fini(struct lima_ip *ip) void lima_l2_cache_fini(struct lima_ip *ip)
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
struct lima_ip; struct lima_ip;
int lima_l2_cache_resume(struct lima_ip *ip);
void lima_l2_cache_suspend(struct lima_ip *ip);
int lima_l2_cache_init(struct lima_ip *ip); int lima_l2_cache_init(struct lima_ip *ip);
void lima_l2_cache_fini(struct lima_ip *ip); void lima_l2_cache_fini(struct lima_ip *ip);
......
...@@ -59,12 +59,44 @@ static irqreturn_t lima_mmu_irq_handler(int irq, void *data) ...@@ -59,12 +59,44 @@ static irqreturn_t lima_mmu_irq_handler(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
int lima_mmu_init(struct lima_ip *ip) static int lima_mmu_hw_init(struct lima_ip *ip)
{ {
struct lima_device *dev = ip->dev; struct lima_device *dev = ip->dev;
int err; int err;
u32 v; u32 v;
mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_HARD_RESET);
err = lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET,
LIMA_MMU_DTE_ADDR, v, v == 0);
if (err)
return err;
mmu_write(LIMA_MMU_INT_MASK,
LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR);
mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma);
return lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING,
LIMA_MMU_STATUS, v,
v & LIMA_MMU_STATUS_PAGING_ENABLED);
}
int lima_mmu_resume(struct lima_ip *ip)
{
if (ip->id == lima_ip_ppmmu_bcast)
return 0;
return lima_mmu_hw_init(ip);
}
void lima_mmu_suspend(struct lima_ip *ip)
{
}
int lima_mmu_init(struct lima_ip *ip)
{
struct lima_device *dev = ip->dev;
int err;
if (ip->id == lima_ip_ppmmu_bcast) if (ip->id == lima_ip_ppmmu_bcast)
return 0; return 0;
...@@ -74,12 +106,6 @@ int lima_mmu_init(struct lima_ip *ip) ...@@ -74,12 +106,6 @@ int lima_mmu_init(struct lima_ip *ip)
return -EIO; return -EIO;
} }
mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_HARD_RESET);
err = lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET,
LIMA_MMU_DTE_ADDR, v, v == 0);
if (err)
return err;
err = devm_request_irq(dev->dev, ip->irq, lima_mmu_irq_handler, err = devm_request_irq(dev->dev, ip->irq, lima_mmu_irq_handler,
IRQF_SHARED, lima_ip_name(ip), ip); IRQF_SHARED, lima_ip_name(ip), ip);
if (err) { if (err) {
...@@ -87,11 +113,7 @@ int lima_mmu_init(struct lima_ip *ip) ...@@ -87,11 +113,7 @@ int lima_mmu_init(struct lima_ip *ip)
return err; return err;
} }
mmu_write(LIMA_MMU_INT_MASK, LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR); return lima_mmu_hw_init(ip);
mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma);
return lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING,
LIMA_MMU_STATUS, v,
v & LIMA_MMU_STATUS_PAGING_ENABLED);
} }
void lima_mmu_fini(struct lima_ip *ip) void lima_mmu_fini(struct lima_ip *ip)
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
struct lima_ip; struct lima_ip;
struct lima_vm; struct lima_vm;
int lima_mmu_resume(struct lima_ip *ip);
void lima_mmu_suspend(struct lima_ip *ip);
int lima_mmu_init(struct lima_ip *ip); int lima_mmu_init(struct lima_ip *ip);
void lima_mmu_fini(struct lima_ip *ip); void lima_mmu_fini(struct lima_ip *ip);
......
...@@ -63,7 +63,7 @@ static u32 lima_pmu_get_ip_mask(struct lima_ip *ip) ...@@ -63,7 +63,7 @@ static u32 lima_pmu_get_ip_mask(struct lima_ip *ip)
return ret; return ret;
} }
int lima_pmu_init(struct lima_ip *ip) static int lima_pmu_hw_init(struct lima_ip *ip)
{ {
int err; int err;
u32 stat; u32 stat;
...@@ -88,7 +88,7 @@ int lima_pmu_init(struct lima_ip *ip) ...@@ -88,7 +88,7 @@ int lima_pmu_init(struct lima_ip *ip)
return 0; return 0;
} }
void lima_pmu_fini(struct lima_ip *ip) static void lima_pmu_hw_fini(struct lima_ip *ip)
{ {
u32 stat; u32 stat;
...@@ -109,3 +109,23 @@ void lima_pmu_fini(struct lima_ip *ip) ...@@ -109,3 +109,23 @@ void lima_pmu_fini(struct lima_ip *ip)
lima_pmu_wait_cmd(ip); lima_pmu_wait_cmd(ip);
} }
} }
int lima_pmu_resume(struct lima_ip *ip)
{
return lima_pmu_hw_init(ip);
}
void lima_pmu_suspend(struct lima_ip *ip)
{
lima_pmu_hw_fini(ip);
}
int lima_pmu_init(struct lima_ip *ip)
{
return lima_pmu_hw_init(ip);
}
void lima_pmu_fini(struct lima_ip *ip)
{
lima_pmu_hw_fini(ip);
}
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
struct lima_ip; struct lima_ip;
int lima_pmu_resume(struct lima_ip *ip);
void lima_pmu_suspend(struct lima_ip *ip);
int lima_pmu_init(struct lima_ip *ip); int lima_pmu_init(struct lima_ip *ip);
void lima_pmu_fini(struct lima_ip *ip); void lima_pmu_fini(struct lima_ip *ip);
......
...@@ -223,6 +223,23 @@ static void lima_pp_print_version(struct lima_ip *ip) ...@@ -223,6 +223,23 @@ static void lima_pp_print_version(struct lima_ip *ip)
lima_ip_name(ip), name, major, minor); lima_ip_name(ip), name, major, minor);
} }
static int lima_pp_hw_init(struct lima_ip *ip)
{
ip->data.async_reset = false;
lima_pp_soft_reset_async(ip);
return lima_pp_soft_reset_async_wait(ip);
}
int lima_pp_resume(struct lima_ip *ip)
{
return lima_pp_hw_init(ip);
}
void lima_pp_suspend(struct lima_ip *ip)
{
}
int lima_pp_init(struct lima_ip *ip) int lima_pp_init(struct lima_ip *ip)
{ {
struct lima_device *dev = ip->dev; struct lima_device *dev = ip->dev;
...@@ -230,9 +247,7 @@ int lima_pp_init(struct lima_ip *ip) ...@@ -230,9 +247,7 @@ int lima_pp_init(struct lima_ip *ip)
lima_pp_print_version(ip); lima_pp_print_version(ip);
ip->data.async_reset = false; err = lima_pp_hw_init(ip);
lima_pp_soft_reset_async(ip);
err = lima_pp_soft_reset_async_wait(ip);
if (err) if (err)
return err; return err;
...@@ -254,6 +269,16 @@ void lima_pp_fini(struct lima_ip *ip) ...@@ -254,6 +269,16 @@ void lima_pp_fini(struct lima_ip *ip)
} }
int lima_pp_bcast_resume(struct lima_ip *ip)
{
return 0;
}
void lima_pp_bcast_suspend(struct lima_ip *ip)
{
}
int lima_pp_bcast_init(struct lima_ip *ip) int lima_pp_bcast_init(struct lima_ip *ip)
{ {
struct lima_device *dev = ip->dev; struct lima_device *dev = ip->dev;
......
...@@ -7,9 +7,13 @@ ...@@ -7,9 +7,13 @@
struct lima_ip; struct lima_ip;
struct lima_device; struct lima_device;
int lima_pp_resume(struct lima_ip *ip);
void lima_pp_suspend(struct lima_ip *ip);
int lima_pp_init(struct lima_ip *ip); int lima_pp_init(struct lima_ip *ip);
void lima_pp_fini(struct lima_ip *ip); void lima_pp_fini(struct lima_ip *ip);
int lima_pp_bcast_resume(struct lima_ip *ip);
void lima_pp_bcast_suspend(struct lima_ip *ip);
int lima_pp_bcast_init(struct lima_ip *ip); int lima_pp_bcast_init(struct lima_ip *ip);
void lima_pp_bcast_fini(struct lima_ip *ip); void lima_pp_bcast_fini(struct lima_ip *ip);
......
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